AA_buchstabe.eps

Ich kaufe ein Ü

Die Welt der regulären Ausdrücke

Wer suchet, der findet. Die Frage ist nur: Was? Mit regulären Ausdrücken formulieren Sie auf der Kommandozeile eine Suche etwas allgemeiner und finden so fast immer das Richtige.

Würde eine Marketing-Agentur einem wirklich nützlichen Werkzeug den Namen "regulärer Ausdruck" verpassen, wäre das sicher ihr letzter Auftrag. Spätestens am folgenden Wikipedia-Eintrag würde selbst die Neugier eines unerschrockenen Anwenders ein jähes Ende finden [1]:

Das klingt kryptisch und reguläre Ausdrücke sehen kryptisch aus. Warum sollten Sie sich also jemals damit beschäftigen? Weil sie nicht nur wahnsinnig nützlich sind, sondern auch jederzeit schnell zur Hand. Reguläre Ausdrücke stecken in Werkzeugen wie egrep, awk und sed und stehen damit in der Shell standardmäßig zur Verfügung. Aber auch in OpenOffice setzen Sie die praktischen Spürhunde ein. Zudem trügt der Anschein: Sie sind viel einfacher anzuwenden, als es der Wikipedia-Eintrag glauben machen möchte.

Umlaute finden

Ein einfaches Beispiel zum Warmwerden. Wollen Sie in einem Verzeichnis alle Dateien mit einem Umlaut finden, variieren Sie ls einfach sieben Mal:

$ ls *ä*;ls *ö*;ls *ü*;ls *ß*;ls *Ä*;ls *Ö*; ls *Ü*;

Klingt irgendwie umständlich? Zwar verwenden Sie auch hier schon Platzhalter, einfacher gerät die Suche aber mit einem regulären Ausdruck. Dann genügt der folgende Aufruf:

$ ls | egrep '[äöüßÄÖÜ]+'

Der zweite Aufruf wirkt doch deutlich übersichtlicher und einfacher, als der erste. In den eckigen Klammern definieren Sie eine Gruppe von Zeichen. Der Befehl ls listet sämtliche Dateien in einem Verzeichnis auf und reicht die Ergebnisse über eine Pipe an egrep weiter. Das gibt nur Ergebnisse zurück, die einen oder mehrere der Buchstaben in den Klammern beinhalten (Abbildung 1). Das Pluszeichen prüft, ob die vorhergehenden Zeichen ein- oder mehrmals auftauchen.

Wählerisch sein

Noch deutlicher wird der Nutzen, wenn Sie Zeichenketten in umfangreichen Textdateien oder Skripten suchen. Der folgende Aufruf findet im oben zitierten Abschnitt aus Wikipedia die Worte "regulärer", "regular", "RegExp", "Regex" und "Reguläre", aber nicht das Wort "Regeln":

egrep '\b[Rr]eg[eEu][lx](\b|[^n])\w*\b' --only-matching wiki.txt

Der Befehl durchforstet dabei den Text namens wiki.txt und gibt dank der Option --only-matching nur die Treffer zurück (Abbildung 2). Dabei steht \b für eine Wortgrenze, also den Anfang oder das Ende einer Zeichenkette. [Rr] ist eine Zeichenklasse, die auf ein R oder ein r passt. Dann muss sich eg anschließen, darauf kann eines der Zeichen e, E oder u folgen, darauf eines der beiden Zeichen l oder x. (\b|[^n]) bedeutet, dass hier das Wort entweder aufhört oder ein Zeichen folgt, das kein n ist (andernfalls würde die Regel auch auf das Wort Regeln passen). Das ^ innerhalb einer Zeichenklasse in eckigen Klammern bedeutet, dass diese Zeichen nicht vorkommen dürfen. Anschließend dürfen ein oder mehrere Groß- oder Kleinbuchstaben bzw. Ziffern folgen und das Wort enden (\w*\b).

Neben egrep erweist sich awk als überaus nützlicher Freund und Helfer auf der Kommandozeile, der reguläre Ausdrücke dankbar entgegennimmt. Wollen Sie zum Beispiel die Größe aller Dateien im aktuellen Verzeichnis aufsummieren, deren Name mit einem Datum der Form 2010-03-01 beginnt, so eignet sich folgender Aufruf:

ls -l | awk 'BEGIN{sum=0} $8 ~ /[0-9]+-[0-9]+-[0-9]+.*/{sum=sum+$5}END{print sum}'

Den regulären Ausdruck verbirgt awk zwischen den beiden Schrägstrichen (/). Die Variable $8 steht für den achten Teil in einer Zeile: Geben Sie zum Beispiel ls -l ein, steht in der Ergebnisliste an achter Stelle stets der Dateiname. Diesen Teil vergleicht awk dann mit dem regulären Ausdruck. Der erwartet mindestens eine Ziffer, gefolgt von einem Bindestrich, dann wieder mindestens eine Ziffer, noch einen Bindestrich und abschließend wieder mindestens eine Ziffer. Danach dürfen beliebige Zeichen folgen (.*). Der Rest im Skript addiert die Ergebnisse, die es jeweils in der fünften Zeile der Treffer findet ($5) und gibt die Summe aus (Abbildung 3).

Einem Freund empfehlen