Home / LinuxUser / 2005 / 08 / Suchen und Finden mit Regulären Ausdrücken

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

„Klickbunt auf dem Server? Warum nicht, wenn's hilft!"
(220 Punkte bei 8 Stimmen)
KDE 4.10.2, Gnome 3.6 und mehr
(143 Punkte bei 5 Stimmen)
Google schmeißt Jabber raus ...
(121 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

Strukturierte Suche

Suchen und Finden mit Regulären Ausdrücken

Zeichenklassen

Als erste Metazeichen untersuchen wir die eckigen Klammern: [...]. Innerhalb dieser Klammern können Sie eine Gruppe von Zeichen spezifizieren, die alle vorkommen dürfen. Nehmen Sie einmal an, Sie wollten die Städte Hamburg und Harburg finden, deren Namen recht ähnlich klingen. Mit der simplen Suchfunktion eines Editors müssten Sie die Suche zweimal vornehmen, einmal nach Hamburg und einmal nach Harburg. Mit egrep verwenden Sie stattdessen einfach den Regex Ha[mr]burg verwenden:

$ egrep -i 'Ha[mr]burg' stadtliste.txt
Hamburg
Harburg

Ausformuliert bedeutet dieser Regex: Die Zeichen H, a, gefolgt von einem m oder r, gefolgt von b, u, r, g. Wollem Sie nun auch noch Bad Homburg suchen, müssen Sie den Ausdruck etwas erweitern zu: H[ao][mr]burg. Dieser Regex würde zusätzlich einen weiteren Ort finden, wenn er in der Liste existierte. Erraten Sie, welchen? Kleiner Tipp: Er liegt in Niedersachsen.

Statt einzelner erlaubter Zeichen können Sie mit dem Minuszeichen (-) auch einen Zeichenbereich angeben. Dies stellt insbesondere dann eine Erleichterung dar, wenn aufeinander folgende Zeichen wie A-Z oder 0-9 gemeint sind. Stellen Sie sich vor, Sie müssten [ABCDEF...Z] tippen! [A-Z] sieht doch wesentlich entspannter aus.

Als Beispiel können Sie eine HTML-Datei betrachten, in der Sie nach allen Header-Tags suchen wollen (also <H1>, <H2>, <H3>, <H4>). Der Regex dazu lautet: H[1-4]. Das ist gleichbedeutend mit, aber wesentlich kürzer als H[1234].

Zeilenanfang und Zeilenende

Als nächstes wollen wir alle Städte auflisten, die den Titel "Bad" führen dürfen. Bei der Eingabe des naheliegenden Befehls erhalten wir aber:

<B>$ egrep -i 'Bad' stadtliste.txt<B>
Bad Homburg
Bad Nauheim
Friedrichsbad
Baden-Baden

Obwohl Friedrichsbad bestimmt wunderschön ist (falls es überhaupt existiert), erfüllt es doch nicht unsere strengen Bedingungen. Das Problem lässt sich auf zwei Arten lösen: Erstens könnten Sie auf den Schalter -i verzichten, dann würde Egrep explizit nach einem großen 'B' suchen. In dem Fall hätten Sie das Problem dann aber nicht mit einem Regex gelöst, sondern mit den Bordmitteln von egrep.

Zweitens könnten Sie angeben, dass das 'B' unmittelbar am Anfang der Zeile stehen muss. Damit würde Friedrichsbad nicht mehr angezeigt werden. Das hierfür verwendete Metazeichen ist das Hochzeichen ^. Der korrekte Regex für diese Aufgabe lautet demnach ^Bad.

Ein Versuch zeigt, dass bei einem Aufruf mit diesem Regex Friedrichsbad zwar aus der Ausgabe verschwindet, Baden-Baden aber noch immer erscheint. Der Reguläre Ausdruck arbeitet also noch nicht ausreichend präzise. Das Merkmal, das "Bad XXX" deutlich von "Baden-Baden" unterscheidet, ist das auf das d folgende Leerzeichen. Praktischerweise handelt es sich beim Leerzeichen ebenfalls um ein ganz normales Zeichen, das in einem Regex vorkommen darf. Erweitern Sie den Regulären Ausdruck also zu '^Bad ' (nun mit Leerzeichen hinter dem d), geht nichts mehr schief:

<B>$ egrep -i '^Bad ' stadtliste.txt<B>
Bad Homburg
Bad Nauheim

Auf ähnlichem Weg können Sie auch das Zeilenende näher spezifizieren. Möchten Sie also erreichen, dass Hamburg, nicht aber Burgwedel angezeigt wird, formulieren Sie: burg$. Das bedeutet soviel wie: Auf die Zeichen B, u, r, g muss das Zeilenende folgen.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 128 Punkte (9 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

title_2013_06

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Emacs als Psychologe
Emacs als Psychologe
Tim Schürmann, 21.05.2013 11:49, 0 Kommentare

Wer beim Schreiben in Emacs nicht mehr weiter weiß oder schier an einer Programmieraufgabe verzweifelt, der kann den eingebauten Psychologen um Rat fragen.

1966 entwickelte der Infor...

Aktuelle Fragen

Kontakt via QR code hinzufügen
Herman Sproesser, 17.05.2013 17:46, 3 Antworten
Hi hab in der aktuellen ausgabe 06.2013 den artikel über QR Codes gelesen. Ich hab nartürlich...
Dateimanager Dolphin, wo legt er die Datei Kommentare ab?
Uwe Heine, 16.05.2013 15:19, 1 Antworten
Suse Linux 12.1 - KDE 4.7.2 / Dolphin 1.7. Ich habe bei vielen Dateien über Dolphin Kommentare...
wie baut man Kernel Module so, dass sie mit jedem Kernel laden?
GoaSkin , 22.04.2013 10:22, 1 Antworten
Hallo, baut man anhand eines Kernel-Sources Module, nutzt Linux im Normalfall eine strikte V...
Problem beim Installieren von SuSe 12.3
Georg Prokert, 14.04.2013 00:04, 16 Antworten
Hallo, auf meinem neuem Laptop (Acer Aspire V3-771, Intel Core i5-3230 M, Intel HD Graphics 4...
lvm wieder loswerden
Peter Dibbern, 11.04.2013 16:28, 4 Antworten
Ich habe sämtliche alten Kisten ausgeschlachtet und aus der Teilen einen Rechner zusammengeschrau...