Bash-Regular-Expression-Matching

ShellShellBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell(("Shell")) -.-> shell/AdvancedScriptingConceptsGroup(["Advanced Scripting Concepts"]) shell(("Shell")) -.-> shell/SystemInteractionandConfigurationGroup(["System Interaction and Configuration"]) shell/VariableHandlingGroup -.-> shell/variables_decl("Variable Declaration") shell/VariableHandlingGroup -.-> shell/variables_usage("Variable Usage") shell/VariableHandlingGroup -.-> shell/str_manipulation("String Manipulation") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") shell/ControlFlowGroup -.-> shell/cond_expr("Conditional Expressions") shell/AdvancedScriptingConceptsGroup -.-> shell/cmd_substitution("Command Substitution") shell/SystemInteractionandConfigurationGroup -.-> shell/globbing_expansion("Globbing and Pathname Expansion") subgraph Lab Skills shell/variables_decl -.-> lab-391551{{"Bash-Regular-Expression-Matching"}} shell/variables_usage -.-> lab-391551{{"Bash-Regular-Expression-Matching"}} shell/str_manipulation -.-> lab-391551{{"Bash-Regular-Expression-Matching"}} shell/if_else -.-> lab-391551{{"Bash-Regular-Expression-Matching"}} shell/cond_expr -.-> lab-391551{{"Bash-Regular-Expression-Matching"}} shell/cmd_substitution -.-> lab-391551{{"Bash-Regular-Expression-Matching"}} shell/globbing_expansion -.-> lab-391551{{"Bash-Regular-Expression-Matching"}} end

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 abc genau 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ürde a.c "abc", "axc", "a1c" und so weiter matchen.
    • * (Sternchen): Passt auf das vorherige Zeichen null oder mehrmals. ab*c würde "ac", "abc", "abbc", "abbbc" usw. matchen.
    • ^ (Zirkumflex): Passt auf den Zeilenanfang. ^hello wü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
Regex and Matching

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+c passt 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?c passt 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.