Bash Scripting

Bash Pattern Matching meistern

Spread the love

Reguläre Ausdrücke mit dem =~ Operator

Bashs =~ Operator ermöglicht leistungsstarkes Matching regulärer Ausdrücke. Reguläre Ausdrücke bieten weit größere Flexibilität als einfaches Wildcard-Matching und erlauben es Ihnen, komplexe Muster für die Stringmanipulation und -validierung zu definieren. Der Operator liefert „true“, wenn die Zeichenkette links dem regulären Ausdruck rechts entspricht, der immer in doppelte Anführungszeichen eingeschlossen sein muss.


string="Dies ist ein Teststring mit 123 Ziffern"

if [[ "$string" =~ "test" ]]; then
  echo "Der String enthält 'test'"
fi

if [[ "$string" =~ "string$" ]]; then  # $ markiert das Ende des Strings
  echo "Der String endet mit 'string'"
fi

if [[ "$string" =~ "[0-9]+" ]]; then  # Übereinstimmung mit einer oder mehreren Ziffern
  echo "Der String enthält Ziffern"
fi

if [[ "$string" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$ ]]; then
  echo "Der String sieht aus wie eine E-Mail-Adresse"
fi
  

Die obigen Beispiele zeigen die grundlegende Verwendung regulärer Ausdrücke. Für komplexere Muster konsultieren Sie ein umfassendes Tutorial oder eine Referenz zu regulären Ausdrücken. Die Flexibilität regulärer Ausdrücke macht sie ideal für Aufgaben wie die Validierung von E-Mail-Adressen, IP-Adressen oder anderen strukturierten Daten in Strings.

Wildcard-Matching mit dem * Operator

Das * Wildcard, einfacher als reguläre Ausdrücke, entspricht null oder mehr Zeichen. Es wird häufig im File Globbing und in einfachen bedingten Prüfungen verwendet. Obwohl weniger leistungsstark, ist es für einfache Szenarien effizient.


files=(*.txt)  # Erweitert zu einer Liste aller .txt Dateien

if [[ "$filename" == "*.log" ]]; then
  echo "Dies ist eine Logdatei"
fi

if [[ "$variable" == "pre*suf" ]]; then
  echo "Die Variable beginnt mit 'pre' und endet mit 'suf'"
fi
  

Das erste Beispiel zeigt File Globbing; die anderen zeigen einfaches Mustermatching in bedingten Anweisungen. Beachten Sie, dass ==, nicht =~, für Wildcard-Matching verwendet wird.

Extrahieren von Untermustern

Sowohl reguläre Ausdrücke als auch Wildcards können Teile eines übereinstimmenden Strings extrahieren, obwohl sich die Methoden deutlich unterscheiden.

Reguläre Ausdrücke (mit =~)

Reguläre Ausdrücke verwenden Fanggruppen, definiert mit Klammern (), um bestimmte Teile des übereinstimmenden Strings zu isolieren. Diese Fanggruppen sind über das BASH_REMATCH Array zugänglich.


string="Meine Benutzer-ID ist 12345"
if [[ "$string" =~ "ID ist ([0-9]+)" ]]; then
  user_id="${BASH_REMATCH[1]}"
  echo "Benutzer-ID: $user_id"
fi
  

([0-9]+) fängt eine oder mehrere Ziffern ein, die in ${BASH_REMATCH[1]} gespeichert werden.

Wildcards (mit *)

Wildcard-Matching unterstützt keine direkte Extraktion von Untermustern. Stattdessen benötigen Sie Stringmanipulation nach einem einfachen Match.


filename="mein_report_2024-10-26.txt"
if [[ "$filename" == "mein_report_*.txt" ]]; then
  date="${filename%.*}"  # Entfernt die '.txt' Erweiterung
  date="${date##*_}"     # Entfernt alles vor dem letzten '_'
  echo "Reportdatum: $date"
fi
  

Dieses Beispiel verwendet Parametererweiterung, um die Extraktion von Untermustern zu erreichen, was einen weniger eleganten, aber effektiven Ansatz für einfachere Szenarien darstellt.

Bash bietet vielseitige Möglichkeiten zum Mustermatching. Wählen Sie die Methode – reguläre Ausdrücke oder Wildcards – die am besten zu Ihren Bedürfnissen passt, wobei Sie Leistung und Einfachheit in Einklang bringen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert