Hier zum Testen

Komplexe reguläre Ausdrücke wie diese testen wir am besten erstmal: Dazu kann man selbstverständlich eine Testdatei schreiben – oder aber die sogenannten Here-Dokumente zum interaktiven Testen benutzen. Der etwas wunderlich anmutende Name meint schlicht und einfach Dokumente, die an Ort und Stelle ("hier") interaktiv erzeugt werden und als Standardeingabe für ein Kommando dienen.

cat << EOF | grep  "[[:alnum:]_-]+"

meldet sich mit einem erwartungsfrohen >-Prompt und möchte von uns Eingaben, die cat entgegennimmt und an grep über die Pipe als Eingabe weiterleitet. Unsere Eingabe wird solange an cat weitergeleitet ("<<"), bis wir das vereinbarte Stoppwort (in unserem Fall EOF) eingeben:

> Blablabla
>
> _-
> EOF

Hätten Sie das Ergebnis – nichts – erwartet? Eigentlich nicht, denn die Blablabla- und _--Zeile entsprechen unserem Muster "mindestens ein alphanumerisches, Minus- oder Bindestrichzeichen, gern auch mehrere". Dass die Zeile mit den Leerzeichen nicht passt, war dagegen zu erwarten.

Was tun? Ein Blick in unser Muster zeigt, dass das Minuszeichen als normales Zeichen, nicht als Zeichen mit Sonderbedeutung gehandhabt wird. Warum sollte das beim Plus anders sein? Es drängt sich der Verdacht auf, dass unser Muster eigentlich "ein alphanumerisches, Minus- oder Bindestrichzeichen, gefolgt von einem Plus" bedeutet. Der Test aufs Exempel:

cat << EOF | grep  "[[:alnum:]_-]+"
> aa+
> B+
> EOF
aa+
B+

bestätigt den Verdacht: Unser Muster paßte auf aa+ und B+, nicht aber auf Blablabla und _-. Was tun? Einfach die normale Bedeutung von + durch das Flucht-("Escape-")Zeichen \ auf die in der Man-Page beschriebene Sonderbedeutung "umswitchen":

cat << EOF | grep  "[[:alnum:]_-]\+"
> Blablabla
>
> _-
> EOF
Blablabla
_-

Das Kreuz mit dem \

Genau umgekehrt verhält es sich mit dem Punkt, der Grundnamen und Dateinamenendung voneinander trennt. Da der Punkt in regulären Ausdrücken von vornherein eine Sonderbedeutung ("beliebiges Zeichen") hat, muss diesmal diese Sonderbedeutung durch das Flucht-(Escape-)Zeichen \ abgeschaltet werden:

[[:alnum:]_-]\+\.

Fehlen noch die Dateinamenendungen. Hier haben jetzt nur noch alphanumerische Zeichen Platz (".htm", ".html", ".jpg", ".GIF" und ".mp3" beispielsweise). Zum Testen muss erstmal eine ein Zeichen lange Endung reichen:

cat << EOF | grep  "[[:alnum:]_-]\+\.[:alnum:]"
> hallo.m
> Huhu.G
> dsf.)
> asdad.9
> EOF
hallo.m

Dass dsf.) von unserem regulären Ausdruck nicht erwischt wird, ist klar. Aber warum fehlen Huhu.G und asdad.9? [:alnum:] umfasst doch eigentlich auch Großbuchstaben und Ziffern… Allerdings haben die eckigen Klammern die Sonderbedeutung, einen Zeichenpool zu umschließen, aus dem an der jeweiligen Stelle ein Zeichen passen muss. Dieser Zeichenpool umfasst hier :, a, l, n, u, m und überflüssigerweise nochmal ein :, was auch nicht besser gefunden wird, nur, weil es doppelt da steht. Man hätte dafür auch [almnu:] schreiben können. Und hallo.m war der einzige String mit einem Zeichen aus diesem Pool nach dem Punkt.

Also die eckigen Klammern durch das Fluchtzeichen in seiner Bedeutung umswitchen? Das jetzt von unseren Beispielstrings gar keiner mehr gefunden wird, wird klar, wenn man sich mit

cat << EOF | grep  "[[:alnum:]_-]\+\.\[:alnum:\]"
> hallo.[:alnum:]
> hallo.a
> EOF
hallo.[:alnum:]

ansieht, dass dann auch die eckigen Klammern in ihrer wörtlichen Bedeutung benutzt werden.

Was dann? Angesichts unseres funktionierenden Bereichs "[[:alnum:]_-] liegt die Überlegung nahe, einen Bereich zu bilden, der lediglich eine Auswahlmöglichkeit, nämlich [:alnum:] selbst beinhaltet. Et voilà:

cat << EOF | grep  "[[:alnum:]_-]\+\.[[:alnum:]]"

tut genau das, was es soll. Fragt sich nun, wie sich ausdrücken lässt, dass genau drei oder vier [:alnum:]-Zeichen hintereinander stehen müssen. Das Plus hilft da leider nicht weiter, denn es meint "von eins bis unendlich viele des vorhergehenden Zeichens". Allerdings hält die grep-Man-Page direkt unter der Erklärung zu + auch folgendes bereit:

{n,m}  The preceding item is matched at least n times, but
       not more than m times.

Sollen – wie in unserem Fall – mindestens drei, maximal aber vier aufeinanderfolgende Zeichen aus dem vorangestellten [:alnum:]-Pool stammen, so sollte uns

grep  "[[:alnum:]_-]\+\.[[:alnum:]]{3,4}"

zum Ziel unserer Wünsche führen. Dass es das nicht tut, lässt inzwischen wohl schon jede/n automatisch zum Backslash \ greifen:

grep  "[[:alnum:]_-]\+\.[[:alnum:]]\{3,4\}"

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Reguläre Ausdrücke
    Regulären Ausdrücken begegnet man auf Unix-Systemen an allen Ecken und Enden. Doch was genau hat es damit auf sich, und wie nutzt man sie?
  • The Answer Girl
    Lauter kaputte Links in Webseiten, nur weil bei ihrer Erstellung Groß- und Kleinschreibung unbeachtet blieb? Dieses Problem lässt sich zum Beispiel mit einem Perl-Skript lösen.
  • The Answer Girl
    Solange man online ist, halten sich die Sprachprobleme in Grenzen: Web-Wörterbücher wie dict.leo.org helfen in meistens akzeptabler Geschwindigkeit über die Hürden des fehlenden (Englisch-) Wortschatzes hinweg. Doch wehe, man ist weder mit Standleitung noch Flatrate gesegnet: Schon ärgert man sich, das Regal mit den papiernen Wörterbüchern am anderen Ende des Raums aufgestellt zu haben.
  • Sauber verzahnt
    Verbinden, trennen, umformatieren: Unter Linux gibt es zahlreiche kleine Helfer, die die Arbeit mit Textdateien perfekt beherrschen – und die dazu noch perfekt zusammenarbeiten.
  • Erste Schritte mit Regular Expressions
    Computer erleichtern die Arbeit – man muss ihnen nur genau sagen, was sie tun sollen. Mit regulären Ausdrücken beschleunigen Sie das Suchen und Ersetzen von Zeichenketten auf elegante Art.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Broadcom Adapter 802.11n nachinstallieren
Thomas Mengel, 31.10.2017 20:06, 2 Antworten
Hallo, kann man nachträglich auf einer Liveversion, MX Linux auf einem USB-Stick, nachträglich...
RUN fsck Manually / Stromausfall
Arno Krug, 29.10.2017 12:51, 1 Antworten
Hallo, nach Absturz des Rechners aufgrund fehlendem Stroms startet Linux nicht mehr wie gewohn...
source.list öffnet sich nicht
sebastian reimann, 27.10.2017 09:32, 2 Antworten
hallo Zusammen Ich habe das problem Das ich meine source.list nicht öffnen kann weiß vlt jemman...
Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 6 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...