2017-04-24 6 views
4

Ich habe eine Textdatei mit einer einzigen Spalte von Daten. Nehmen Sie die folgenden Daten zum BeispielRegex und/oder sed, um Kleinbuchstaben zu ersetzen

united states 
germany 
france 
canada 

Von denen ich versuche, alle möglichen gemischten Fallvariationen zu generieren. Zum Beispiel könnte die neue Datei wie folgt aussehen:

United states 
uNited states 
unIted states 
uniTed states 
unitEd states 
uniteD stated 
united States 
united sTates 
united stAtes 
united staTes 
united statEs 
united stateS 
UNited states 

Und so weiter, bis alle möglichen Fallvariationen jedes Wortes generiert wurden.

den oben Eingang gegeben und erwartete Ausgabe I

  1. Ist regex und sed das richtige Werkzeug für diesen Job drei Fragen?
  2. Welche Alternativen muss ich für diese Aufgabe regex und sed?
  3. Wenn ich regex und sed verwenden würde, wie könnte die korrekte Syntax aussehen?
+0

Die Beschreibung und die Probe Ausgang scheinen zu widersprechen. Zumindest wenn die Probenausgabe beendet ist. Sie möchten alle möglichen Fälle, einschließlich 'UnItEd StAtEs'? Oder nur ein Großbuchstabe in jeder Zeile? – Yunnosch

+0

Ist nur Kleinschreibung + Leerzeichen für den Eingang garantiert? – Yunnosch

+0

Schön geschriebene Frage für einen Neuling ;-) – GhostCat

Antwort

2

1) Keine

2) Awk und substr()

3) Sie würden nicht

beginnen mit diesem:

$ echo 'foo' | 
awk '{ 
    for (i=1;i<=length($0);i++) { 
     print substr($0,1,i-1) toupper(substr($0,i,1)) substr($0,i+1) 
    } 
}' 
Foo 
fOo 
foO 

und Massage passen mit die offensichtliche Logik.

+0

Können Sie Ihr "1) Nein" ausarbeiten? – Yunnosch

+1

sed ist für einfache Substitutionen auf einzelnen Zeilen, das ist alles. Für etwas anderes als s/alt/neu/sollten Sie awk für Einfachheit, Klarheit, Robustheit, Effizienz, Portabilität und jede andere wünschenswerte Eigenschaft der Software verwenden. Ihre Anforderungen können nicht einfach mit s/old/new/erfüllt werden, daher ist sed nicht das richtige Werkzeug für diesen Job. Alle sed-Konstrukte außer s, g und p (mit -n) werden heute nur für die mentale Übung verwendet, nicht für Produktionssoftware, da sie Mitte der 1970er Jahre obsolet wurden, als awk erfunden wurde. –

+1

Und das bin ich, ich lese (oder verstehe) nicht alle deine Antworten. Ich habe meinen Kommentar entfernt. – Yunnosch

1

Für den Spaß von sed.

1) Ja. (Z GNU sed Version 4.2.1)
2) Vielleicht awk, perl
3) Siehe Code unten

sed -E "s/^.*$/\n&#\n/;:a;s/\n([^#\n]*)([^#\n])#([^#\n]*)\n/\n\1#\u\2\3\n\1#\l\2\3\n/;ta;s/(^\n#|\n$)//g;s/\n#/\n/g;" 

Dies gilt davon aus, dass "#" ist nicht Teil der in der Datei Strings.

  • ein bestimmtes Muster erzeugen
    (Start- und mit Neuem-Zeile enden, den Cursor mit # markiert)
  • eine Schleife
    • Ersetzen von Text zwischen newlines starten und die Cursor mit demselben Text zweimal enthalten,
      einmal mit Großbuchstaben vor dem Cursor, einmal mit Kleinbuchstaben
    • Cursor zum Anfang bewegen
    • l oop wenn das ersetzt etwas
  • Zeilenumbrüche am Anfang und Ende und Cursor entfernen

Beachten Sie, dass # nicht besonders. Es muss nur ein Zeichen sein, das nicht in der Eingabe und nicht in der gewünschten Ausgabe vorkommen wird. Hoffentlich könnt ihr einen besonderen Charakter finden.
Wenn Sie alle Zeichen haben können, wird es kompliziert. Sehen Sie sich die Kommentare zu dieser Antwort an. Es gibt wahrscheinlich eine Diskussion.

Ausgang (für die Eingabe "foo"):

FOO 
fOO 
FoO 
foO 
FOo 
fOo 
Foo 
foo 
+0

Um zu lernen, was passiert, wenn ich # als Teil der Zeichenfolge habe? – user316114

+1

Mein Respekt dafür. – Yunnosch

+0

@ user316114 Sieht so aus, als gäbe es keine einfache generische Lösung für lästige Briefe. Ich nehme an, dass der "andere nicht vorkommende Brief", den ich in die Antwort eingefügt habe, Sie nicht zufriedenstellt. Wenn Sie eine Frage erstellen, könnte sie interessant werden oder zumindest Hinweise auf eine Antwort ziehen. – Yunnosch

Verwandte Themen