Dieser Post, der regelmäßig geupdatet wird, soll sammeln, wie man reguläre Ausdrücke auf verschiedenen Kommandozeilen, Skript- und Programmiersprachen verwendet.
Aktuell beinahltet der Post nur Grundlagen, die überall gelten, und spezifische Hinweise für die Linux Shell. Mit der Ziet werde ich noch Hinweise für die Windows PowerShell, Windows cmd und für verschiedene Programmiersprachen hinzufügen.
die folgenden Grundlagen funktionieren (Gott sei DAnk) in allen Implementierungen von regulären Ausdrücken. So konnte sich zumindest teilweise eine kleine STandardisierung von regulären Ausdrücken durchsetzen.
Mit dem Zirkumflex können Sie überall nach Zeichenketten suchen, mit einem bestimmten String beginnen sollen. Sie können beispielsweise sagen, ich möchte in einer datei alle Zeilen haben, die mit einer Raute (#) beginnen. Unter Linux würden Sie dazu das komamndo grep verwenden
grep ^# <datei>
einige Anwendender grübeln immer bei der Frage: „was ist, wenn ich nach einer Zeichenkette suchen möchte, die mit einem Leerzeichen afange?“. DAfür liefern reguläre Ausdrücke entsprehcende Platzhalter, beispielsweise können Sie das folgendermaßen abfragen.
egrep '^\s' <datei>
Das ganze können Sie noch weiter stricken. Was ist denn jeztt, wenn wir wollen, dass sowohl Zeilen, die mit einem Leerzeicehn beginnen, als auch Zeilen, die mit einer Raute beginnen, ausgegeben werden? Nun, dafür bieten reguläre Ausdrücke den Oder-Operator |, sodass wir folgendermaßen arbeiten könnten.
egrep '^\s|^#' <datei>
Leere Zeilen, die nur einen Carriage Return (also einen Zeilenumbruch) enthalten, findet man mit
grep ^$ <datei>
das Dollar steht hier entsprechend stellvertretend für einen Zeilenumbruch.In der Praxis möchte man jedoch meist genua das Gegenteil, also alle Zeilen außer die LEerzeilen finden, daher verwendet amn in der Praxis häufig
grep -v ^$ <datei>
Sie können auch andere sogenannte non-printing characters auf diese Art und Weise finden. Wenn Sie erst wissen müssen, welches Ziechen für den von Ihnen gesuchten non-printing-character steht, können Sie diesen rausfinden über
cat -vet <datei>
Der non printing character wird dann mit dem Zeichen dargestellt, mit dem er in regular Expressions vertreten wird.
während ein Zirkumflex außerhalb von eckigen Klammern bedeutet, „suche nach Zeichenketten die mit damit beginnen: “ sagt ein Zirkumflex innerhlab von eckigen klammern „Suche nach allem außer dem, was in den eckigen Klammern steht“. [^a-z] sucht also nach allem, was keine Kleinbuchstaben von a-z hat.
Jetzt da wir wissen, dass das Dollar-Zeichen für einen Zeilenumbruch steht, können wir mit
grep .$ <datei>
sagen, wir wollen alles auswählen, was mit einem Punkt aufhört, wenn danach eine neue Zeile beginnt. Wir können also nach Zeilenenden suchen.
Was ist, wenn ich aus einer Datei nun alle Zeilen mit Worten mit c<irgendein Buchstbae>t haben möchte, also z. B. cat, cUt, ctt, cOt usw.?
Hierfür gibt es den Punkt. Unter Linux könntet ihr beispielswiese nach einer derartigen Zeichenkette wieder suchen mit
grep "c.t" <datei>
Was nun aber, wenn ihr beispielsweise wollt, dass zwischen c und t nur Vokale stehen dürfen? Damit würden wir noch Zeichenketten mit cat und cut, aber keine mehr mit ctt, cdt o. Ä. erwischen. In disem Fall könnt ihr eine sogenannte Range an Zeichen, die in die Zeichenkette passen dürfen, angeben.
grep "c[aeiou]t" <datei>
Wenn ihr hingeen wollt, dass alle Buchstaben von A-P an der STelle sein dürfen, womit Zeichenketten wie cat, cpt, cot, ckt, cbt etc. ausgewählt werden würden, könntet ihr angeben:
grep "c[a-p]t" <datei>
Im Moment wählen wir aber nur Kleinbuchstbaen aus. wEnn wir auch Großbuchstaben auswählen wollen, müssen wir mit dem Oder-Operator (|) arbeiten und sagen
grep "c[a-pA-P]|" <datei>
Damit werden nun auch die Großbuchstaben A-P ausgewählt.
Was ist nun, wenn ihr nach Ziffern in einer Datei suchen wollt? In diesem Fall würden wir sagen
grep "[0-9]" <datei>
Und wenn es statt einstelligen Ziffern nur dreistellige Zahlen sein dürfen (100, 101, 199, 200, 999 etc.), dann schreiben wir
grep "[0-9][0-9][0-9]" <datei>
Statt solcher Ranges kann man auch Klassen angeben
und statt dieser Klassen kann man man auch Abkürzungen schreiben wie beispielswiese
Wenn diese Abkürzungen (Abbreviations) groß geschrieben werden, sucht man nach Zeichenketten, die nicht diese Zeichenketten enthalten.. /D sucht also nach allen Zeichenketten, die keine Ziffer enthalten. [^0-9]
Natürlich können Sie nach dreistelligen Zahlen statt mit
[0-9][0-9][0-9]
beispielsweise auch suchen über
[0-9]{3}
Dieses Konzept nennt man quantifizieren, also ein Suchmuster muss mehrfals vorkommen. Diese Quantifizierer kombiniert man am besten entweder mit Ranges, z. B.
[a-zA-z]{10}
Jedoch gibt es quhc Auntifizierer, die ohne Ranges auskommen, beispielswiese
damit sollte auch klar sein, dass A* oder A? in Regulären Ausdrücken was anderes bedueutet als man es von Wildcards gewohnt ist, die man beispielsweise an anderen Stellen in der Linux Shell oder der Windows Eingabeaufforderung verwenden kann. Denn in der Linux Shell oder in der windows Eingabeaufforderung würde A* bedeueten:
„Suche nach allen Dateien, die nach einem großen A entweder gar nichts mehr oder beliebig viele Zeichen haben“
Während also A* bei regulären Ausdrücken neben einer Datei bzw. Zeichenkette namens A auch eine Datei oder Zeichenkette namens B oder C auswählen würde, würde man bei der Windows eingabeaufforderung damit neben A nicht mehr B oder C, sondern nur noch AA, AB, AC usw. auswählen, da diese den Asterisk (*) als Wildcard interpretiert.
A? wählt bei regulären Ausdrücken ebenfalls A, B und C aus, während die Linux Shell oder Windows Eingabeaufforderung nur A, AA, AB, usw. auswählt. Diesen Unterschied zu kennen ist essentiell, denn die Linux Binary grep versteht ein A* im Sinne des regulären Ausdrucks, während beispielsweise das Kommando ls -la A* im Sinne einer Wildcard interpretiert. Diese Feinheit bringt viele administratoren zur täglichen Verzweiflung, wenn Sie versuchen, im Linux-Kommando grep den Stern (*) und das Fragezeichen (?) wie eine Wildcard zu verwenden.
Welche reguläre Ausdrücke unterstützt werden, ist in der Linux Shell leider immer sehr abhängig von der binary, die Sie verwenden wollen. Beispielswiese unterstützt das kommando grep keinen Oder-Operator, sodass Sie bei einem regulären Ausdruck wie beispielsweise
grep '^\s|^#' <datei>
ins Leere schauen würden. Verwenden Sie hingegen stattdessen egrep, funktioniert es wieder. Das führt leider bei vielen unerfahrenen Linux-Usern häufig zu Frustration.
Wie bereits wieter oben bei den Grundlagen im Kapitel Quantifiers erwähnt, gibt es Binaries, die einen Ausdruck wie A* als Quantifizierer im Sinne eines regulären Ausdrucks verstehen (z. B: egrep), und andere Binarys diesen als Wildcard interpretieren (z. B. ls).
Wenn dir dieser Post gefallen hat, teile ihn doch auf Social Media, abonniere und verfolge mich per E-Mail, RSS-Feed, Social Media oder registriere dich auf meiner Seite. Wenn du registriert bist, like den Post bitte, wenn er dir gefallen hat!]]>