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 03/2018 NEUE DISTRIBUTIONEN

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

Internet abschalten
Karl-Heinz Hauser, 20.02.2018 20:10, 2 Antworten
In der Symbolleiste kann man das Kabelnetzwerk ein und ausschalten. Wie sicher ist die Abschaltu...
JQuery-Script läuft nicht mit Linux-Browsern
Stefan Jahn, 16.02.2018 12:49, 2 Antworten
Hallo zusammen, ...folgender goldener Code (ein jQuery-Script als Ergebnis verschiedener Exper...
XSane-Fotokopie druckt nicht mehr
Wimpy *, 30.01.2018 13:29, 2 Antworten
openSuse 42.3 KDE 5.8.7 Seit einem Software-Update druckt XSane keine Fotokopie mehr aus. Fehler...
TOR-Browser stürzt wegen Wikipedia ab
Wimpy *, 27.01.2018 14:57, 0 Antworten
Tor-Browser 7.5 based on Mozilla Firefox 52.8.0 64-Bit. Bei Aufruf von http: oder https://de.wi...
Wifikarte verhindert Bootvorgang
Maik Kühn, 21.01.2018 22:23, 1 Antworten
iwlwifi-7265D -26 failed to load iwlwifi-7265D -25 failed to load iwlwifi-7265D -24 failed to l...