Einführung und Tutorial

Sed

Reguläre Ausdrücke


Einführung

Reguläre Ausdrücke sind für die meisten Linux/Unix Tools und Skript-Sprachen, wie z.B. Perl und Python, 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 Schiffe
Am 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 außerdem 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 "*" heißt, 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 sitzet
Die 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.* paßt auf alle Zeichenketten, die mit dem Wort Gewaltig beginnen.

  • $ ist analog fürs Stringende.

  • Der Punkt . paßt auf genau ein beliebiges Zeichen außer 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.


© Copyright 2004 - 2008, Bodenseo, Linux-Kurse am Bodensee, Bernd Klein