Shells: Tutorial


* Einführung * Installation * Paketmanager * Grundlagen * Shells * Entwicklung * KDE * Skriptsprachen * AWK * PHP * Perl * Apache * Veranstaltungen * Schulungen * Bücher * Netzwerk * OpenOffice * OpenSource * Samba

Shells


© <a href="http://www.fotolia.de/p/29003">Ljupco Smokovski</a> - FOTOLIA
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 Linux Kurse
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. 

© Copyright 2007 - 2010, Bernd Klein mit freundlicher Unterstützung von Bodenseo, Linux-Kurse und Schulungen,
Foto linke Seite (Mann mit Strick und Colt): Foto: © Ljupco Smokovski, fotolia 984022