28.11
2006

Reguläre Ausdrücke GREP

Einführung

Reguläre Ausdrücke sind für die meisten Linux/Unix Tools und
Skript-Sprachen essentiell,  deshalb sollte sich jeder, der ernsthaft mit Linux
arbeiten will, die Mühe machen, sie zu verstehen. Auch wenn einem am Anfang ein
Ausdruck wie

^[0-9]+\.[0-9][0-9] *EUR

recht kryptisch
vorkommen mag, so kann man es bald mit ein wenig Übung  wie eine Überschrift in
der Tageszeit lesen.

Damit die folgenden Beispiele nicht allzu trocken
sind, werden wir Heinrich Heines Lorelei als zu filternde Beispieldatei
wenn möglich verwenden. Speichern Sie das Gedicht bitte als heine.txt, wenn Sie
die folgenden Beispiele nachvollziehen wollen.

Ein regulärer Ausdruck in
Linux (ebenso wie in Unix) beschreibt ein Textmuster (text pattern), welches
eine Folge von Zeichen definiert.

grep

Ein recht einfaches aber dennoch mächtiges Tool, welches reguläre
Ausdrücke benutzt, ist das Kommando grep, bzw. fgrep und egrep.

grep "Schiff" heine.txt

liefert als Ausgabe alle Zeilen, die das Wort “Schiff” enthalten:

Den Schiffer im kleinen SchiffeAm Ende Schiffer und Kahn;

Stellen wir uns nun vor, dass wir eine Zeile suchen, von der wir wissen,
dass das Wort oder “kämmt” drin vorkommt und ausserdem das Wort “Kamme”. Diese
Aufgabe kann man elegant mit einem einfachen regulären Ausdruck lösen. Zunächst
muss man wissen, dass eine Punkt “.” innerhalb eines regulären Ausdrucks für ein
beliebiges Zeichen steht. Ein Stern “*” heisst, dass das vor ihm stehende Zeichen
beliebig oft vorkommen kann (also auch überhaupt nicht!). Der Ausdruck “.*”
passt also auf eine beliegige Zeichenkette.

grep "kämmt.*Kamme" heine.txt

liefert die gewünschte Zeile:

Sie kämmt es mit goldenem Kamme

Möchten wir nun alle Zeilen herausfiltern, in denen entweder das Wort
“Jungfrau” oder das Wort “Lorelei” vorkommt, so lässt sich dies mit grep nicht
mehr elegant bewerkstellen. Um diese Aufgabe zu lösen benötigen wir egrep, was
jedoch im Prinzip das gleiche ist, als würde man grep mit der Option “-E”
aufrufen. Egrep kann erweiterte reguläre Ausdrücke verarbeiten.

egrep "Jungfrau|Lorelei" heine.txt

liefert die beiden Zeilen, die jeweils eines der beiden Suchwörter
enthalten:

Die schönste Jungfrau sitzetDie Lorelei getan.

Sonderzeichen in regulären Ausdrücken und ihre Bedeutung:

  • Der Backslash \ dient als Escape-Zeichen:

    • Steht er vor einem Sonderzeichen, so verleirt es seine Sonderfunktion und
      wird wie das entsprechende Alphazeichen betrachtet.

    • Für bestimmte alphabetische Zeichen für es zu einer Sonderfunktion, wie z.B.
      \r für ein Return also ASCII 13 und \n Linefeed ASCII 10

  • ^ markiert einen Stringanfang: Das Suchmuster ^Gewaltige.*
    passt auf alle Zeichenketten, die mit dem Wort Gewaltig beginnen.

  • $ ist analog fürs Stringende.

  • Der Punkt . passt auf genau ein beliebiges Zeichen ausser dem
    Zeilenendezeichen \n. Beispiele siehe oben.

  • Die öffnende eckige Klammer [ leitet eine Zeichenmenge ein.

  • | trennt zwei Alternativen, wie wir oben mit "Jungfrau|Lorelei"
    gesehen haben.

  • ? steht für null oder eine Wiederholung des vorhergehenden
    Ausdrucks.

  • Der Stern * steht für für Null oder mehr Wiederholungen des
    vorhergehenden Zeichens oder Ausdrucks.

  • Das Pluszeichen steht für für mindestens eine Wiederholung des vorhergehenden
    Ausdrucks.

Eckige Klammern leiten eine Menge von Zeichen ein. Genau ein Zeichen aus
dieser Menge, kann im String an dieser Stelle vorkommen. Innerhalb einer soclen
Menge, haben einige Sonderzeichen wieder Sonderbedeutungen: ^ als
erstes Zeichen einer Zeichenmenge negiert die Zeichenmenge. Dies gilt jedoch
wirklich nur, wenn ^ wirklich als ersten Zeichen steht. Mit -
kann man einen Bereich definieren, zB. [0-9] definiert alle Ziffern von 0 bis 9.

powered by performancing firefox

Drucken PDF

Switch to our mobile site