Einführung
Dieses Tutorial führt Sie in reguläre Ausdrücke (regex) in Bash ein. Reguläre Ausdrücke sind ein leistungsstarkes Werkzeug zum Finden von Mustern in Texten. Indem Sie regex lernen, verbessern Sie Ihre Fähigkeiten in der Shell-Skripting erheblich. Dadurch können Sie Texte verarbeiten, Daten extrahieren und Aufgaben effektiver automatisieren. Dieses Tutorial ist für Anfänger konzipiert, daher ist keine vorherige Erfahrung mit regex erforderlich. Wir beginnen mit den Grundlagen und erweitern Ihre Kenntnisse schrittweise.
Grundlagen von regulären Ausdrücken und Mustererkennung verstehen
Beginnen wir mit den grundlegenden Konzepten von regulären Ausdrücken. Ein regulärer Ausdruck ist eine Zeichenfolge, die ein Suchmuster definiert. Stellen Sie sich das als eine sehr leistungsstarke Methode zum Suchen von Text vor.
Hier sind die grundlegenden Bausteine:
- Literale Zeichen: Die meisten Zeichen stimmen einfach mit sich selbst überein. Beispielsweise wird der reguläre Ausdruck
abcgenau die Zeichenkette "abc" matchen. - Metazeichen: Dies sind spezielle Zeichen, die in regex eine bestimmte Bedeutung haben. Schauen wir uns einige wichtige an:
.(Punkt): Passt auf jedes einzelne Zeichen (außer eine neue Zeile). Also würdea.c"abc", "axc", "a1c" und so weiter matchen.*(Sternchen): Passt auf das vorherige Zeichen null oder mehrmals.ab*cwürde "ac", "abc", "abbc", "abbbc" usw. matchen.^(Zirkumflex): Passt auf den Zeilenanfang.^hellowürde eine Zeile matchen, die mit "hello" beginnt.$(Dollarzeichen): Passt auf das Zeilenende.world$würde eine Zeile matchen, die mit "world" endet.[](eckige Klammern): Definiert eine Zeichenklasse. Es passt auf ein beliebiges der Zeichen innerhalb der Klammern.[abc]würde "a", "b" oder "c" matchen.[0-9]passt auf jede einzelne Ziffer.
Jetzt erstellen wir ein Bash-Skript, um unser Verständnis zu testen. Erstellen Sie eine Datei namens regex_test.sh mit dem Befehl touch:
cd ~/project
touch regex_test.sh
Öffnen Sie als Nächstes regex_test.sh mit einem Texteditor (z.B. nano oder vim) und fügen Sie folgenden Code hinzu:
#!/bin/bash
string="Hello World"
if [[ "$string" =~ ^Hello ]]; then
echo "The string starts with Hello"
else
echo "The string does not start with Hello"
fi
Speichern Sie die Datei und machen Sie sie ausführbar:
chmod +x regex_test.sh
Führen Sie schließlich das Skript aus:
./regex_test.sh

Die Ausgabe sollte anzeigen, dass die Zeichenkette mit "Hello" beginnt.
Arbeiten mit Zeichensätzen in einem Skript
Zeichensätze, die mit eckigen Klammern [] definiert werden, ermöglichen es Ihnen, ein Zeichen aus einer bestimmten Gruppe zu matchen. Dies ist sehr nützlich für die Erstellung flexiblerer Muster.
- Zeichenbereiche: Innerhalb von
[]können Sie ein Bindestrich (-) verwenden, um einen Bereich anzugeben.[a-z]passt auf jeden Kleinbuchstaben,[A-Z]passt auf jeden Großbuchstaben und[0-9]passt auf jede Ziffer. Sie können diese auch kombinieren:[a-zA-Z0-9]passt auf jedes alphanumerische Zeichen. - Negation: Wenn Sie ein
^als erstes Zeichen innerhalb von[]setzen, negieren Sie die Klasse.[^0-9]passt auf jedes Zeichen, das keine Ziffer ist.
Ändern wir unser regex_test.sh-Skript, um Zeichensätze zu verwenden. Öffnen Sie regex_test.sh mit einem Texteditor und ersetzen Sie seinen Inhalt durch Folgendes:
#!/bin/bash
string="cat"
if [[ "$string" =~ c[a-z]t ]]; then
echo "Match found!"
else
echo "No match."
fi
Speichern Sie die Datei und führen Sie sie aus:
./regex_test.sh
Die Ausgabe sollte anzeigen, dass ein "Match found!" vorliegt. Dies liegt daran, dass c[a-z]t auf jede dreibuchstabige Zeichenkette passt, die mit 'c' beginnt und mit 't' endet, wobei das mittlere Zeichen ein Kleinbuchstabe ist.
Verwenden von Quantoren zur Wiederholung von Mustern in einem Skript
Quantoren steuern, wie oft ein Zeichen oder eine Gruppe wiederholt werden soll. Dies verleiht Ihren regulären Ausdrucksmustern erhebliche Stärke.
+(Pluszeichen): Passt auf das vorherige Zeichen einmal oder mehrmals.ab+cpasst auf "abc", "abbc", "abbbc" usw., aber nicht auf "ac".?(Fragezeichen): Passt auf das vorherige Zeichen null oder einmal (d.h., es macht das vorherige Zeichen optional).ab?cpasst auf "ac" und "abc", aber nicht auf "abbc".*(Sternchen): Passt auf das vorherige Zeichen null oder mehrmals. Dies haben wir bereits gesehen.{n}: Passt auf das vorherige Zeichen genau n mal.a{3}passt auf "aaa".{n,}: Passt auf das vorherige Zeichen n oder mehrmals.a{2,}passt auf "aa", "aaa", "aaaa" usw.{n,m}: Passt auf das vorherige Zeichen zwischen n und m mal (einschließlich).a{1,3}passt auf "a", "aa" oder "aaa".
Ändern wir unser regex_test.sh-Skript, um Quantoren zu verwenden. Öffnen Sie regex_test.sh mit einem Texteditor und ersetzen Sie seinen Inhalt durch Folgendes:
#!/bin/bash
string="abbbc"
if [[ "$string" =~ ab+c ]]; then
echo "Match found!"
else
echo "No match."
fi
Speichern Sie die Datei und führen Sie sie aus:
./regex_test.sh
Die Ausgabe sollte anzeigen, dass ein "Match found!" vorliegt. Dies liegt daran, dass ab+c auf eine Zeichenkette passt, die mit 'a' beginnt, gefolgt von einem oder mehreren 'b's und endet mit 'c'.
Extrahieren von Daten mit Erfassungsgruppen in einem Skript
Klammern () werden verwendet, um Teile eines regulären Ausdrucks zu gruppieren. Dies ist nützlich, um Quantoren auf mehrere Zeichen anzuwenden und um übereinstimmenden Text zu erfassen.
Wenn Sie Klammern verwenden, speichert Bash den Text, der von diesem Teil des regulären Ausdrucks übereinstimmt, in einem speziellen Array namens BASH_REMATCH. BASH_REMATCH[0] enthält die gesamte übereinstimmende Zeichenkette, BASH_REMATCH[1] enthält den Text, der von der ersten Gruppe übereinstimmt, BASH_REMATCH[2] den von der zweiten Gruppe und so weiter.
Ändern wir unser regex_test.sh-Skript, um Daten mit Erfassungsgruppen zu extrahieren. Öffnen Sie regex_test.sh mit einem Texteditor und ersetzen Sie seinen Inhalt durch Folgendes:
#!/bin/bash
string="apple123"
if [[ "$string" =~ ^([a-z]+)([0-9]+)$ ]]; then
fruit="${BASH_REMATCH[1]}"
number="${BASH_REMATCH[2]}"
echo "Fruit: $fruit"
else
echo "No match."
fi
Speichern Sie die Datei und führen Sie sie aus:
./regex_test.sh
Die Ausgabe sollte "Fruit: apple" enthalten. Dieses Skript extrahiert den Fruchtnamen aus der Zeichenkette mithilfe von Erfassungsgruppen.
Ersetzen von Text mit sed in einem Skript
Erstellen wir ein neues Skript namens sed_test.sh, um die Verwendung von sed zu üben.
cd ~/project
touch sed_test.sh
chmod +x sed_test.sh
Öffnen Sie sed_test.sh mit einem Texteditor und fügen Sie Folgendes hinzu:
#!/bin/bash
string="apple123"
echo "$string" | sed 's/[0-9]/X/g'
Speichern Sie die Datei und führen Sie sie aus:
./sed_test.sh
Die Ausgabe sollte lauten: appleXXX. Dieses Skript verwendet sed, um alle Ziffern in der Zeichenkette durch den Buchstaben "X" zu ersetzen.
Zusammenfassung
Dieses Tutorial hat Sie mit regulären Ausdrücken (Regular Expressions, regex) in Bash vertraut gemacht. Sie haben grundlegende regex-Konzepte, Zeichenklassen, Quantoren, Gruppierung, Erfassung und die Verwendung von regex mit sed kennengelernt. Durch das Schreiben und Ausführen von Bash-Skripten haben Sie praktische Erfahrung mit diesen leistungsstarken Tools gesammelt. Denken Sie daran, mit verschiedenen regex-Mustern zu üben und zu experimentieren, um Ihr Verständnis zu festigen.



