Shells
Home
Erste Schritte mit der Bourne-Shell
Dateien zeilenweise zusammenfügen
Head or Tail
Schleifen und Zählen
Shell-Variablen
Pipes
Sortieren von Daten
Wer sucht der findet!
Praktische Shell-Skripte
Rechtschreibung
Schleifen und elegant Zählen
Texte formatieren mit fmt und fold
Umlenkung der Ein- und der Ausgaben
Klammer-Erweiterung
Verknüpfen von Textdateien mittels Schlüsselfeldern
Mit freundlicher Unterstützung von:
Linux-Kurse und Seminare
Veranstalter des
Linux-Tag am Bodensee 2007 und 2008
Kontakt
Haftung
Impressum
Problem Hilfe Startseite
|
Klammererweiterung
Generierung von Zeichenketten in der Bash
Die Klammererweiterung (englisch: brace expansion) bildet das
Kreuzprodukt aus mehreren Mengen. Sie wird häufig zur Generierung
von oder Population von synthetischen Testdecks benutzt, denn sie
bietet eine elegante Möglichkeit automatisch eine große
Menge von Verzeichnis- und Dateinamen zu generieren.
Die Arbeitsweise der Klammererweiterung erklärt man am besten
anhand eines Beispiels.
[bernd@localhost 020Shells]$ echo {a,b,c}{x,y,z} ax ay az bx by bz cx cy cz
Im obigen Beispiel werden alle möglichen Kombinationen aus Zeichen
bestehend aus der Menge {a, b, c} und der Menge {x, y, z} gebildet.
Permutationen
Vielen mathematisch interessierten und gebildeten Personen stellt sich
nahezu zwangsläufig die Frage, ob die Bash-Shell auch eine
einfache Möglichkeit bietet alle Permutationen1 aus
mehreren Mengen
zu bilden.
Es lässt sich wirklich denkbar einfach realisieren, indem man das
egrep-Kommando benutzt. Im folgenden einfachen Beispiel werden alle
Permutationen aus den Zeichen 'x', 'y' und 'z' gebildet:
echo {w,x,y,z}{w,x,y,z}{w,x,y,z}{w,x,y,z}$'\n' | egrep -v '([w-z]).*\1'
Wenn jemand nicht so vertraut mit dem egrep-Kommando und vor allen
Dingen mit regulären Ausdrücken ist, stellt sich obiger
Ausdruck als schwierig zu verstehen dar.
Wir erläutern deshalb diese Befehlszeile in einzelnen Schritten:
Stände dort nur
egrep '([w-z]).*'
würde egrep alle Zeilen matchen und ausgeben. Übrigens
könnte man die obige Anweisung auch ohne die runden Klammern
schreiben. Wir brauchen sie allerdings noch später.
Die Option "-v" bewirkt, dass nur die Zeilen ausgegeben werden, die
nicht matchen, also würde
egrep -v '([w-z]).*'
keine Zeile ausgeben.
Nun betrachten wir den eigentlichen egrep-Ausdruck
egrep -v '([w-z]).*\1'
"\1" bewirkt, dass das erste innerhalb runder Klammern stehende
Zeichen ausgegeben wird. Im Prinzip steht also in diesem Beispiel der
reguläre Ausdruck a-priori nicht fest. Er wird erst im laufenden
Betrieb generiert, in Abhängigkeit vom gematchten String.
Es werden also zunächst alle Zeichenketten ausgewählt, die
ein wiederkehrendes Zeichen haben, also z.B. ein x kommt an der 1. und
2. Position oder an der 2. und 4. Position usw. vor. Wegen des "-v"
werden nun aber nur die Zeilen ausgegeben, die keine wiederkehrenden
Buchstan enthalten.
1Unter einer
Permutation (lat. permutare - vertauschen) versteht man eine
Veränderung in der Anordnung einer geordneten Menge (z.B. String)
durch Vertauschung von mindestens zwei Komponenten. In der Mathematik
versteht man unter einer Permutation eine bijektive Abbildung einer in
der Regel endlichen Menge in sich selbst.
|