6 Reguläre Ausdrücke
»Everybody stand back. I know regular expressions.«
(Dt. »Aus dem Weg. Ich kenne reguläre Ausdrücke.«)
– Randall Munroe, https://xkcd.com/208/
In diesem Kapitel werden wir uns mit einem bedeutsamen Thema, nämlich den regulären Ausdrücken, befassen. Diese können über die Tools awk und sed hervorragend verwendet werden. Sie erleichtern den Alltag der Linux-Nutzung enorm und sind ein wichtiger Bestandteil von Shellskripts.
6.1 Grundlagen und Aufbau regulärer Ausdrücke
Reguläre Ausdrücke wurden bereits vor Jahrzehnten mit 4BSD bzw. dem ed-Editor eingeführt und werden heute noch im Wesentlichen so verwendet, wie sie einst definiert wurden.
Wir werden vorwiegend grundlegende Formen der regulären Ausdrücke behandeln und weniger oft benutzte auslassen, um im Rahmen des Buches zu bleiben und Sie nicht unnötig zu »quälen«.
Zum Ende dieses Abschnitts werden wir uns noch mit dem Tool grep beschäftigen. Doch zuerst zurück zur Einleitung.
Reguläre Ausdrücke können als Platzhalter verwendet werden. So bieten sie die Möglichkeit, Kommandozeilenaufrufe und Programme in sehr kurzer Weise zu gestalten, wenn es um die Verarbeitung von Text-Streams geht. Dies wiederum geht auf Kosten der Lesbarkeit, doch lassen reguläre Ausdrücke sich mit etwas Übung bis zu einem gewissen Grad problemlos entziffern.
Um Ihnen ein etwas genaueres Bild von dieser Thematik zu liefern, möchten wir ein einfaches Beispiel nutzen. Lassen Sie sich davon aber nicht täuschen: Reguläre Ausdrücke sind unglaublich mächtig und werden auch in vielen Programmiersprachen genutzt. Wer sie beherrscht, kann Kunststücke vollführen, für die sonst Hunderte oder Tausende Mausklicks nötig wären.
Für den Einstieg befinden wir uns in einem Verzeichnis, dessen Inhalt aus drei Dateien besteht: Baum, baum und Haus.
Da reguläre Ausdrücke auch bei Programmen wie ls angewandt werden können, werden wir sie nun anhand obiger Dateien erläutern.
Zuerst sollen alle Dateien aufgelistet werden, die mit einem beliebigen Zeichen beginnen und auf »aum« enden. Hierzu verwenden wir den regulären Ausdruck ?, der für genau ein beliebiges Zeichen (jedoch kein leeres, also fehlendes Zeichen) steht:
user$ ls ?aum Baum baum
Listing 6.1 Der Zeichen-Operator
Als Nächstes sollen alle Dateien, die mit einem kleinen oder großen »B« beginnen (und mit »aum« enden) aufgelistet werden, anschließend alle Dateien, die mit einem »m« enden, und schließlich alle Dateien, die ein »a« enthalten. * steht dabei für beliebig viele beliebige Zeichen und das leere Zeichen.
user$ ls [bB]aum Baum baum user$ ls *m Baum baum user$ ls *a* Baum baum Haus
Listing 6.2 Einer für alles
Sie werden diese Operatoren im Verlauf des Abschnitts noch näher kennenlernen. Hier folgt zunächst erst einmal (der Übersicht halber) die Auflistung in einer Tabelle.
Zeichen |
Beschreibung |
---|---|
. |
beliebiges Zeichen |
* |
beliebige Anzahl von beliebigen Zeichen (Das heißt, auch gar kein Zeichen – also ein leerer String – entspricht diesem Metazeichen.) |
+ |
beliebige Anzahl des Zeichens (mindestens einmal) |
? |
einzelnes oder kein Vorkommen eines Zeichens |
[..] |
Alle in der Klammerung eingeschlossenen Zeichen können an dieser Stelle vorkommen, beispielsweise [0-9]. |
[^..] |
Eine Negierung. Kommt ein Zeichen nicht vor, ist die Bedingung erfüllt. |
^ |
Zeilenanfang |
$ |
Zeilenende |
x |
Das Zeichen kommt x-mal vor. |
x, |
Das Zeichen kommt x-mal oder mehrmals vor. |
x,y |
Das Zeichen kommt x- bis y-mal vor. |
Tabelle 6.1 Reguläre Ausdrücke