Reguläre Ausdrücke (Regular Expressions)
Durch reguläre Ausdrücke lassen sich in der Linux-Shell komplexe Suchanfragen und Ersetzungsmuster beschreiben.
Ein Beispiel für ein Suchprogramm, dass mit regulären Ausdrücken umgehen kann ist egrep
So zeigt
egrep Suchtext datei.txt beispielsweise alle Zeilen der Datei "datei.txt" an, die die Zeichenkette "Suchtext" enthalten an.
Ein einzellnes Zeichen kann verschieden lauten:
Der . (Punkt) wird durch ein beliebiges Zeichen ersetzt.
So findet
egrep Org.page datei.txt nicht nur Orgapage, sondern auch Orgbpage, Orgcpage, ...
Möchte man nur eine begrenzte Auswahl an Zeichen durchprobieren, so geht das wie folgt:
M[ae][yi]er
steht beispielsweise für die 4 verschiedenen Schreibweisen des Familiennamens.
Von den Zeichen in den []-Klammern wird also jeweils jedes durchprobiert.
Man kann in diesen Klammern auch Bereiche angeben.
[3-7] steht Beispielsweise für 3, 4, 5, 6 und 7.
[a-zA-Z] hingegen für alle Buchstaben, egal ob groß, oder klein geschrieben.
[Mm][ae][yi]er ignoriert die Groß-, bzw. Kleinschreibung des Namens und geht damit alle 8 Möglichkeiten durch.
Das ^-Zeichen kehrt die Liste um. Es darf alles vorkommen, außer die nachfolgenden Zeichen.
[^w] steht also für alles, außer dem kleinen w.
Escapen
Wie oben beschrieben hat der Punkt die Eigenschaft, dass er durch alle Möglichkeiten ersetzt wird.
Was aber, wenn man nun nach "Orgapage.Net" suchen möchte.
Dazu gibt es das \-Zeichen. Ein Zeichen, welches unmittelbar hinter dem \ steht, wird nicht als Befehl gedeutet.
Der Suchtext für das Beispiel lautet also: "Orgapage\.Net"
Platzhalter wiederholen
Mit dem *-Zeichen wird der Platzhalter, nachdem es steht beliebig oft wiederholt.
[abl]* steht daher z.B. für "aaaaaa", aber auch für "blabla", oder "b". Aber auch für gar nichts, da zu beliebig oft wiederholen auch gar nicht wiederholen und überhaupt nicht vorkommen zählen.
egrep [abl]* datei.txt
würde daher alle Zeilen der Datei "datei.txt" ausgeben.
Das +-Zeichen hingegen bedeutet, dass der Platzhalter mindestens einmal vorkommen muss
egrep [abl]+ datei.txt
Findet daher nur die Zeilen, die "aaaaaa", oder "blabla", oder "b", ... enthalten.
Eine andere Schreibweise, bei der man die Ober- und Untergrenze genauer angeben kann ist folgende:
[0-9]{2,4}
Das steht für mindestens 2 und maximal 4 aufeinanderfolgende Ziffern.
Die Obergrenze kann man auch weglassen:
{0,} ist daher gleichbedeutend mit *
und {1,} gleichbedeutend mit +
Ein weiteres Beispiel:
[A-Z]{1,3}-[A-Z]{1,2} [0-9]{1,4}
passt auf alle deutschen Autokennzeichen.
Einmal vorkommen, oder gar nicht vorkommen
Dafür gibt es das ?-Zeichen. Es steht unmittelbar hinter dem zeichen, welches vorkommen darf, aber nicht muss.
Sollen dies mehrere Zeichen sein, so kann man sie mit ()-Klammern umschließen
Orgapage(\.Net)?
findet also Orgapage und Orgapage.Net. Das \-Zeichen escapet dabei den Punkt, wie weiter oben erklärt.
? ist damit eine verkürzte Schreibweise für {0,1}
"Gierige Operatoren"
Der * und das + sind gierige Operatoren. Man versteht darunter, dass sie immer die längstmögliche Zeichenkette finden.
<.*>
findet daher nicht, wie evtl. vermutet alle HTML-Tags in einem Text, sondern die Zeichenkette vom ersten < bis zum letzten > und damit wahrscheinlich den kompletten Text von <html> bis </html>.
Um dennoch das gewünschte zu erreichen, muss man das Suchmuster genauer beschreiben.
Ein recht guter Ansatz für das obige Beispiel wäre:
<[^>]*>
Dieses Beispiel sucht nach einer HTML-Klammer-auf gefolgt von beliebig vielen Zeichen (außer Klammer-zu) und anschließend eine Klammer zu.
Oder-Zeichen
Mit dem |-Zeichen formuliert man eine Oder-Frage
www\.orgapage\.(de|net)
sucht nach unseren beiden Domainnamen.
Rückgriffe innerhalb des Suchmusters
Mit den ()-Klammern können wie oberhalb schon öfter verwendet zusammenhängende Zeichen Grupiert werden.
Das tolle daran ist, dass man auf diese Gruppen auch wieder im Suchmuster zurückgreifen kann.
\1 steht für den Inhalt der ersten ()-Gruppe, \2 für den der 2., ...
So findet man mit (A-za-z)\1 zwei aufeinander folgende identische Buchstaben.
Denn \1 wird durch Zeichen der ersten ()-Klammer ersetzt.
Auf folgende Weise findet man somit auch doppelt aufeinanderfolgende Wörter:
([A-Za-z]+) \1
Anker
^ steht für den Zeilenanfang
$ für das zeilenende
\< steht für den Wortanfang
\> steht für das Wortende
\b steht für das Ende/ den Anfang eines Wortes
( +$) findet also Leerzeichen am Ende einer Zeile
(^$) findet Leerzeilen
Und (^ *#) findet auskommentierte Zeilen ind Shell-Scripten (Also Zeilen die mit beliebig vielen leerzeichen beginnen, oder auch mit keinen und als erstes sonstiges Zeichen ein # haben).
Kommentare Seite:
Die Kommentar-Funktion ist derzeit leider deaktiviert.
Bitte nutze das Forum statt dessen.

