Kapitel 11 Reguläre Ausdrücke und grep
Die Verwendung von regulären Ausdrücken und grep ist Grundlage eines jeden Linux-UNIX-Anwenders. Und für einen Systemadministrator ist sie sowieso unerlässlich, denn es gibt kein vernünftiges System, in dem sie nicht vorkommen. Eine kurze Einführung zu den regulären Ausdrücken wie auch zum Tool grep (und seinen Nachkommen wie bspw. egrep und fgrep) erscheint daher notwendig.
11.1 Reguläre Ausdrücke – die Theorie
 
Reguläre Ausdrücke (engl. regular expression) sind eine leistungsfähige formale Sprache, mit der sich eine bestimmte (Unter-)Menge von Zeichenketten beschreiben lässt. Es muss allerdings gleich erwähnt werden, dass reguläre Ausdrücke kein Tool oder eine Sammlung von Funktionen sind, die von einem Betriebssystem abhängig sind, sondern es handelt sich in der Tat um eine echte Sprache mit einer formalen Grammatik, in der jeder Ausdruck eine präzise Bedeutung hat.
Regulären Ausdrücke werden von sehr vielen Texteditoren und Programmen eingesetzt. Meistens verwendet man sie, um bestimmte Muster zu suchen und diese dann durch etwas anderes zu ersetzen. In der Linux-UNIX-Welt werden reguläre Ausdrücke vorwiegend bei Programmen wie grep, sed und awk oder den Texteditoren vi und Emacs verwendet. Aber auch viele Programmiersprachen, u. a. Perl, Java, Python, Tcl, PHP oder Ruby, bieten reguläre Ausdrücke an.
Die Entstehungsgeschichte der regulären Ausdrücke ist schnell erzählt. Den Ursprung hat ein Mathematiker und Logiker, Stephen Kleene, gelegt. Er gilt übrigens auch als Mitbegründer der theoretischen Informatik, besonders der hier behandelten formalen Sprachen und der Automatentheorie. Stephen Kleene verwendete eine Notation, die er selbst reguläre Menge nannte. Später verwendete dann Ken Thompson (der Miterfinder der Programmiersprache C) diese Notationen für eine Vorgänger-Version des UNIX-Editors ed und für das Werkzeug grep. Nach der Fertigstellung von grep wurden die regulären Ausdrücke in sehr vielen Programmen implementiert. Viele davon benutzen die mittlerweile sehr bekannte Bibliothek regex von Henry Spencer.
Hinweis Sofern Sie Erweiterungen wie Rückwärtsrefernzen verwenden wollen, sei Perl empfohlen, weil grep hier leistungsmäßig »ins Gras beißt«.
|
Wobei inzwischen ja verschiedene regexes (POSIX-RE, Extended-RE und pcre) unterschieden werden. Die Unterschiede sind in den Manuals regex und perlre zu finden. Ein Großteil der Scriptsprachen und Programme stützt sich auf die pcre (Perl Compatible Regular Expression), welche mittlerweile als die leistungsfähigste gilt.
|
11.1.1 Elemente für reguläre Ausdrücke (POSIX-RE)
 
Vorwiegend werden reguläre Ausdrücke dazu verwendet, bestimmte Zeichenketten in einer Menge von Zeichen zu suchen und zu finden. Die nun folgende Beschreibung ist eine sehr häufig verwendete Konvention, welche von fast allen Programmen, die reguläre Ausdrücke verwenden, so eingesetzt wird. Gewöhnlich wird dabei ein regulärer Ausdruck aus den Zeichen des Alphabets in Kombination mit den Metazeichen (die hier gleich vorgestellt werden) gebildet.
Zeichenliterale
Als Zeichenliterale bezeichnet man die Zeichen, die wörtlich übereinstimmen müssen. Diese werden im regulären Ausdruck direkt (als Wort) notiert. Hierbei besteht je nach System auch die Möglichkeit, alles in hexadezimaler oder oktaler Form anzugeben.
Beliebiges Zeichen
Für ein einzelnes, beliebiges Zeichen verwendet man einen Punkt. Dieser Punkt kann dann für ein fast beliebiges Zeichen stehen.
Zeichenauswahl
Die Zeichenauswahl kennen Sie ebenfalls bereits aus der Shell mit den eckigen Klammern [auswahl] (siehe Abschnitt 1.10.6). Alles, was Sie in den eckigen Klammern schreiben, gilt dann exakt für ein Zeichen aus dieser Auswahl. Bspw. [axz] steht für eines der Zeichen »a«, »x« oder »z«. Dies lässt sich natürlich auch in Bereiche aufteilen. Bspw. bei der Angabe von [2–7] besteht der Bereich aus den Ziffern 2 bis 7. Mit dem Zeichen ^ innerhalb der Zeichenauswahl können Sie auch Zeichen ausschließen. Bspw. mit [^a–f] schließen Sie die Zeichen »a«, »b«, »c«, »d«, »e« oder »f« aus.
Vordefinierte Zeichenklassen
Manche Implementationen von regulären Ausdrücken bieten auch vordefinierte Zeichenklassen an. Sofern Sie keine solch vordefinierten Zeichenklassen finden, lässt sich dies auch selbst durch eine Zeichenauswahl in eckigen Klammern beschreiben. Die vordefinierten Zeichenklassen sind letztendlich auch nur eine Kurzform der Zeichenklassen. Tabelle 11.1 nennt einige bekannte vordefinierte Zeichenklassen:
Tabelle 11.1
Vordefinierte Zeichenklassen
Vordefiniert
|
Bedeutung
|
Selbstdefiniert
|
\d
|
eine Zahl
|
[0–9]
|
\D
|
keine Zahl
|
[^0–9]
|
\w
|
ein Buchstabe, eine Zahl oder der Unterstrich
|
[a–zA–Z_0–9]
|
\W
|
kein Buchstabe, keine Zahl und kein Unterstrich
|
[^a–zA–Z_0–9]
|
\s
|
Whitespace-Zeichen
|
[ \f\n\r\t\v]
|
\S
|
alle Zeichen außer Whitespace-Zeichen
|
[^\f\n\r\t\v]
|
Quantifizierer
Als Quantifizierer bzw. Quantoren bezeichnet man Elemente, die es erlauben, den vorherigen Ausdruck in unterschiedlicher Vielfalt in einer Zeichenkette zuzulassen (siehe Tabelle 11.2).
Tabelle 11.2
Quantifizierer
Quantifizierer
|
Bedeutung
|
?
|
Der Ausdruck, der voransteht, ist optional, d. h., er kann ein Mal vorkommen, muss aber nicht. Der Ausdruck kommt also entweder null oder ein Mal vor.
|
+
|
Der Ausdruck muss mindestens ein Mal vorkommen, darf aber auch mehrmals vorhanden sein.
|
*
|
Der Ausdruck darf beliebig oft oder auch gar nicht vorkommen.
|
{min,}
|
Der voranstehende Ausdruck muss mindestens min-mal vorkommen.
|
{min,max}
|
Der voranstehende Ausdruck muss mindestens min-mal, darf aber nicht mehr als max-mal vorkommen.
|
{n}
|
Der voranstehende Ausdruck muss genau n-mal vorkommen.
|
Gruppierung
Ausdrücke können auch zwischen runden Klammern gruppiert werden. Einige Tools speichern diese Gruppierung ab und ermöglichen so eine Wiederverwendung im regulären Ausdruck bzw. der Textersetzung über \1. Es lassen sich hiermit bis zu neun Muster abspeichern (\1, \2 ... \9). Bspw. würde man mit
s/\(string1\) \(string2\) \(string3\)/\3 \2 \1/g
erreichen, dass in einer Textdatei alle Vorkommen von
string1 string2 string3
umgeändert werden in
string3 string2 string1
\1 bezieht sich also immer auf das erste Klammernpaar, \2 auf das zweite usw.
Alternativen
Selbstverständlich lassen sich auch Alternativen definieren. Hierfür wird das Zeichen | verwendet. Bspw.:
(asdf|ASDF)
bedeutet, dass nach »asdf« oder »ASDF« gesucht wird, nicht aber nach »AsDf« oder »asdF«.
Sonderzeichen
Da viele Tools direkt auf Textdateien zugreifen, finden Sie gewöhnlich noch folgende Sonderzeichen definiert (siehe Tabelle 11.3):
Tabelle 11.3
Sonderzeichen bei regulären Ausdrücken
Sonderzeichen
|
Bedeutung
|
^
|
Steht für den Zeilenanfang.
|
$
|
Steht für das Zeilenende.
|
\b
|
Steht für die leere Zeichenkette am Wortanfang oder am Wortende.
|
\B
|
Steht für die leere Zeichenkette, die nicht den Anfang oder das Ende eines Wortes bildet.
|
\<
|
Steht für die leere Zeichenkette am Wortanfang.
|
\>
|
Steht für die leere Zeichenkette am Wortende.
|
\d
|
Ziffer
|
\D
|
Keine Ziffer
|
\s
|
Whitespace
|
\S
|
Kein Whitespace
|
.
|
Zeichen
|
+
|
Voriger Ausdruck mindestens ein Mal.
|
*
|
Voriger Ausdruck beliebig oft.
|
?
|
Voriger Ausdruck null oder ein Mal.
|
Jedes dieser Metazeichen lässt sich auch mit dem Backslash (\) maskieren.
Zusammenfassung
Grau ist alle Theorie und trotzdem ließe sich zu den regulären Ausdrücken noch viel mehr schreiben. Damit das hier Beschriebene für Sie kein Buch mit sieben Sigeln bleibt, soll im nächsten Abschnitt mit grep darauf zurückgegriffen werden. Auch in den Abschnitten zu sed und awk hilft Ihnen das Wissen über reguläre Ausdrücke weiter. Mehr zu den regulären Ausdrücken finden Sie im Internet unter http://www.lrz-muenchen.de/services/schulung/unterlagen/regul/. Wollen Sie gar wissen, wie man reguläre Ausdrücke selbst programmieren kann, finden Sie in »C von A bis Z« einen kleinen Abschnitt dazu, welchen Sie auch online auf meiner Webseite unter www.pronix.de einsehen können.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|