Linux Essentials//Die Einsteiger-Zertifizierung des LPI - Linup Front ...
Linux Essentials//Die Einsteiger-Zertifizierung des LPI - Linup Front ...
Linux Essentials//Die Einsteiger-Zertifizierung des LPI - Linup Front ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
104 7 Reguläre Ausdrücke<br />
7.1 Reguläre Ausdrücke: <strong>Die</strong> Grundlagen<br />
Zeichen<br />
Zeichenklassen<br />
Komplement<br />
Viele <strong>Linux</strong>-Kommandos dienen im weitesten Sinne zur Textbearbeitung – Muster<br />
der Form »tue xyz für alle Zeilen, die wie folgt aussehen« tauchen immer wieder<br />
auf. Ein sehr mächtiges Mittel zur Beschreibung von Textstücken, meist Zeilen in<br />
Dateien, sind »reguläre Ausdrücke« 1 . Auf den ersten Blick ähneln reguläre Ausdrücke<br />
den Suchmustern der Shell (Abschnitt 6.3), aber sie funktionieren anders<br />
und bieten mehr Möglichkeiten.<br />
Reguläre Ausdrücke werden gerne »rekursiv« aus Bausteinen aufgebaut, die<br />
selbst als reguläre Ausdrücke gelten. <strong>Die</strong> einfachsten regulären Ausdrücke sind<br />
Buchstaben, Ziffern und viele andere Zeichen <strong>des</strong> üblichen Zeichenvorrats, die<br />
für sich selber stehen. »a« wäre also ein regulärer Ausdruck, der auf das Zeichen<br />
»a« passt; der reguläre Ausdruck »abc« passt auf die Zeichenkette »abc«. Ähnlich<br />
wie bei Shell-Suchmustern gibt es die Möglichkeit, Zeichenklassen zu definieren;<br />
der reguläre Ausdruck »[a-e]« passt also auf genau eines der Zeichen »a« bis »e«,<br />
und »a[xy]b« passt entweder auf »axb« oder »ayb«. Wie bei der Shell können Bereiche<br />
gebildet und zusammengefasst werden – »[A-Za-z]« passt auf alle Groß- und<br />
Kleinbuchstaben (ohne Umlaute) –, nur die Komplementbildung funktioniert etwas<br />
anders: »[^abc]« passt auf alle Zeichen außer »a«, »b« und »c«. (Bei der Shell<br />
hieß das »[!abc]«.) Der Punkt ».« entspricht dem Fragezeichen in Shellsuchmustern,<br />
steht also für ein einziges beliebiges Zeichen – ausgenommen davon ist nur<br />
der Zeilentrenner »\n«: »a.c« passt also auf »abc«, »a/c« und so weiter, aber nicht<br />
auf die mehrzeilige Konstruktion<br />
a<br />
c<br />
Anker<br />
Zeilenanfang<br />
Zeilenende<br />
Der Grund dafür besteht darin, dass die meisten Programme zeilenorientiert vorgehen<br />
und »zeilenübergreifende« Konstruktionen schwieriger zu verarbeiten wären.<br />
(Was nicht heißen soll, dass es nicht manchmal nett wäre, das zu können.)<br />
Während Shellsuchmuster immer vom Anfang eines Pfadnamens aus passen<br />
müssen, reicht es bei Programmen, die Zeilen aufgrund von regulären Ausdrücken<br />
auswählen, meist aus, wenn der reguläre Ausdruck irgendwo in einer Zeile<br />
passt. Allerdings können Sie diese Freizügigkeit einschränken: Ein regulärer Ausdruck,<br />
der mit dem Zirkumflex (»^«) anfängt, passt nur am Zeilenanfang, und ein<br />
regulärer Ausdruck, der mit dem Dollarzeichen (»$«) aufhört, entsprechend nur<br />
am Zeilenende. Der Zeilentrenner am Ende jeder Zeile wird ignoriert, so dass Sie<br />
»xyz$« schreiben können, um alle Zeilen auszuwählen, die auf »xyz« enden, und<br />
nicht »xyz\n$« angeben müssen.<br />
B<br />
Strenggenommen passen »^« und »$« auf gedachte »unsichtbare« Zeichen<br />
am Zeilenanfang bzw. unmittelbar vor dem Zeilentrenner am Zeilenende.<br />
Wiederholung<br />
Vorrang<br />
Schließlich können Sie mit dem Stern (»*«) angeben, dass der davorstehende<br />
Ausdruck beliebig oft wiederholt werden kann (auch gar nicht). Der Stern<br />
selbst steht nicht für irgendwelche Zeichen in der Eingabe, sondern modifiziert<br />
nur das Davorstehende – das Shellsuchmuster »a*.txt« entspricht also dem regulären<br />
Ausdruck »^a.*\.txt$« (denken Sie an die »Verankerung« <strong>des</strong> Ausdrucks<br />
am Anfang und Ende der Eingabe und daran, dass ein einzelner Punkt auf alle<br />
Zeichen passt).<br />
Wiederholung hat Vorrang vor Aneinanderreihung; »ab*« ist ein einzelnes »a«<br />
gefolgt von beliebig vielen »b« (auch keinem), nicht eine beliebig häufige Wiederholung<br />
von »ab«.<br />
1 Der Begriff kommt eigentlich aus der theoretischen Informatik und beschreibt ein Verfahren zur<br />
Charakterisierung von Mengen von Zeichenketten, die aus Verkettung von konstanten Elementen,<br />
Alternativen von konstanten Elementen und deren möglicherweise unbegrenzter Wiederholung besteht.<br />
Routinen zur Erkennung regulärer Ausdrücke sind elementare Bestandteile vieler Programme,<br />
etwa Compilern für Programmiersprachen. Reguläre Ausdrücke tauchten in der Geschichte von Unix<br />
schon sehr früh auf; die meisten frühen Unix-Entwickler hatten einen Hintergrund in theoretischer<br />
Informatik, so dass die Idee ihnen nahelag.<br />
Copyright © 2012 <strong>Linup</strong> <strong>Front</strong> GmbH