Einstieg in RegEx
Michael Gisbers <michael@gisbers.de>
2023
Was ist RegEx?
- RegEx -> RegExp -> Regular Expressions -> Reguläre
Ausdrücke
- flexible Möglichkeit in Daten zu suchen.
- Erfunden in den 1960ern von Ken Thompson für
qed
einen
Vorgänger von ed
- Später schrieb Thompson
grep
und benutzte RegEx
dort.
Was ist RegEx?
- Es gibt verschiedenste RegEx Dialekte
- Basic Regular Expressions
- Extended Regular Expressions
- Perl Regular Expressions
- etc.
Was ist RegEx?
- Da Programme die RegEx auch noch unterschiedlich implementieren ist
es teilweise anzugeben welchen Dialekt und nach welchem Programm man
RegEx anwenden will.
- Beispiel
find
. Für -regextype
gibt es
folgende Parameter:
- ‘findutils-default’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’,
‘awk’, ‘posix-basic’, ‘posix-egrep’, ‘egrep’, ‘posix-extended’,
‘posix-minimal-basic’, ‘sed’
Wie sieht RegEx aus?
- Welche der folgenden Texte stellen einen RegEx dar?
Wann ist ein RegEx ein RegEx?
- Beispiel 1:
- ‘root’ ist erstmal nur ein Text, wird aber automatisch zu einem
RegEx, wenn er durch einen Interpreter geschickt wird, der RegEx
versteht. In dem Fall werden die Literale (r o o t) in der Reihenfolge
hintereinander gesucht.
Wann ist ein RegEx ein RegEx?
- Beispiel 2:
- ‘r??t’ kann sowohl ein Text, aber auch ein Globbing innerhalb der
Shell sein. Daneben ist es mit einem RegEx Interpreter genutzt die Suche
nach dem Literal ‘r’, das 0 oder 1-mal vorkommt, einem ungenutzten
Quantifier (‘?’) und dem Literal ‘t’.
Wann ist ein RegEx ein RegEx?
- Beispiel 3:
- ‘r[oO]{2}t’ sticht jedem als ein möglicher RegEx ins Auge, ist aber
erst ein RegEx sobald auch ein entsprechender Interpreter genutzt
wird.
Nutzung von RegEx mit grep
Eines der häufig genutzten Programme um Texte aus Dateien zu filtern
ist grep
.
user@linux $ grep 'root' /etc/passwd
Es werden alle Zeilen ausgegeben, die den Text ‘root’ beinhalten. Die
Ausgabe kann mit dem Parameter -v
umgekehrt werden.
Nutzung von RegEx mit grep
Ohne weitere Parameter benutzt grep
den Dialekt
Basic Regular Expression.
Ebenso sollte man statt der Aufrufe egrep
oder
fgrep
die Parameter -E
oder -F
nutzen.
Nutzung von RegEx mit grep
Somit sieht der Aufruf nun wie folgt aus:
user@linux $ grep -E 'root' /etc/passwd
Qualifier
- Qualifier definieren die gesuchten Zeichen.
- Ein Qualifier ist immer genau ein Zeichen
lang.
Qualifier
a |
Literal, ein einzelnes Zeichen |
. |
ein beliebiges Zeichen (auch ein .) |
\. |
Escape für Sonderzeichen. Der ‘.’ wird als
solches gesucht |
[abcABC] |
Zeichenrange, eines der in der Range
aufgeführten Zeichen |
[^abcABC] |
negierte Zeichenrange, keines der in der
Range aufgelisteten Zeichen |
[[:alpha:]] |
Zeichenklasse, kann nur innerhalb einer
Zeichenrange genutzt werden. |
Zeichenrange
- In Zeichenrange können einzelne Zeichen benutzt werden.
- Ranges wie ‘0-9’, ‘a-z’ oder ‘a-Z’ können genutzt werden.
- Das Zeichen ‘-’ muss am Anfang oder Ende der Zeichenrange
stehen.
- Das Zeichen ‘]’ muss am Anfang der Zeichenrange stehen.
- Es können auch mehrere Ranges oder Zeichenklassen innerhalb einer
Zeichenrange genutzt werden.
Erweiterungen
\w |
word character - Zeichen, Ziffer und
_ |
\W |
non-word character - Zeichen das von \w
nicht gematched wird. |
\b |
word-boundary - matched an Wort -
Grenzen |
\B |
non-word-boundary - matched an nicht -
Wort - Grenzen |
\s |
spaces - Leerzeichen, Tabulator,
Zeilenumbruch |
\S |
non-spaces - kein Leerzeichen,
Tabulator, Zeilenumbruch |
Quantifier
- Quantifier stehen direkt hinter dem Zeichen, der Zeichenrange oder
einer Gruppe.
- Quantifier ohne vorherige Qualifier oder nach einem Quantifier
werden in der Regel ignoriert.
Quantifier angeben
{n} |
genau n - mal |
{n,m} |
mindestens n - mal , maximal m - mal |
{n,} |
mindestens n - mal |
Gruppierungen
In runde Klammern ‘()’ eingeschlossene RegEx werden als Gruppe
gesehen. Ein auf die Gruppe folgender Quantifier gilt für die gesamte
Gruppe.
Mit einen ‘|’ kann innerhalb der Gruppe eine oder-Verknüpfung
vorgenommen werden ‘(ab|bcd)’.
Die durch die Gruppierungen gematchten Zeichen werden in einen
Zwischenspeicher gelegt und können über eine ‘backreference’ wieder
ausgelesen werden. ‘(ab)\1’.
Unterschiede zwischen Basic und Extended Regex
- Basic Regex ist veraltet (obsolete) und sollte nicht mehr genutzt
werden.
- Die Zeichen |, +, ?, {, }, (, ) müssen bei Basic Regex escaped (\)
werden.
- Bei Extended Regex müssen die Zeichen nur escaped werden, wenn das
Zeichen selber gemeint ist.
Anker
- Verankerungen sind am Zeilenanfang (
^
) und am
Zeilenende ($
) möglich.
Greedy - gierig
- Regex ist gierig
- Es wird soviel wie möglich zu matchen
- Es wird nur soweit gematched, dass der weitere Regex matchen
kann
sed - Stream Editor
- über den
sed
können Datenströme und Dateien verändert
werden.
- Substitute (
s/suchen/ersetzen/parameter
) ist der meist
genutzte Befehl
- Häufig genutzte Parameter für substitute:
- i - Groß- Kleinschreibung ignorieren
- g - substitute mehrfach anwenden, nicht nur auf den ersten
Match
- p - bei einem Match ausgeben, zusammen mit dem Parameter
-n
sed - Bereich festlegen
n |
Zeile n |
n,m |
Zeile n bis m |
n,+m |
Zeile n und die nächsten m - Zeilen |
/regex/ |
Zeilen auf die der Regex passt, kann statt
n und m genutzt werden |
Hinter dem Bereich kann mit dem Befehl p
die Ausgabe
oder mit s///
ein substitute gemacht werden.
sed - Befehle
p |
Match ausgeben |
d |
Match löschen |
s/// |
Match ersetzen (substitute) |
c text |
Match durch text ersetzen |
a text |
Text an den Match anhängen |
i text |
Text vor dem Match einfügen |
sed - Parameter
-i |
inplace - die angegebene Datei verändern |
-n |
nur Zeilen die per p oder anderen ausgebenden Kommandos
gedruckt werden ausgeben |
-E |
Umschalten auf Extended Regex (sonst Basic Regex) |
-e script |
Script ausführen, mehrfach nutzbar |
-f file |
Script aus Datei lesen |
Vielen Dank
Fragen bitte in den Chat, oder per Mail an
michael@gisbers.de
Matrix: @mgisbers:matrix.dynlinux.io
Mastodon: mgisbers@dynlinux.io