Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 11 Reguläre Ausdrücke und grep
  gp 11.1 Reguläre Ausdrücke – die Theorie
    gp 11.1.1 Elemente für reguläre Ausdrücke (POSIX-RE)
  gp 11.2 grep
    gp 11.2.1 Wie arbeitet grep?
    gp 11.2.2 grep mit regulären Ausdrücken
    gp 11.2.3 grep mit Pipes
    gp 11.2.4 grep mit Optionen
    gp 11.2.5 egrep (extended grep)
    gp 11.2.6 fgrep (fixed oder fast grep)
    gp 11.2.7 rgrep

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.


Rheinwerk Computing

11.1 Reguläre Ausdrücke – die Theoridowntop

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.



Rheinwerk Computing

11.1.1 Elemente für reguläre Ausdrücke (POSIX-RE)  toptop

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.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
 << zurück
  
  Zum Katalog
Zum Katalog: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-Server






 Linux-Server


Zum Katalog: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Katalog: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Katalog: Linux Handbuch






 Linux Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de