Führen Sie reguläre Ausdrücke in einer Case-Anweisung in Bash aus

Abdullah Bukhari 15 Februar 2024
  1. Einführung in reguläre Ausdrücke
  2. Die Notwendigkeit, den komplexen Zeichenfolgenabgleich in Bash zu aktivieren
  3. String-Matching mit Regex in einer Case-Struktur
  4. String-Matching mit Regex in einer If-Else-Struktur
Führen Sie reguläre Ausdrücke in einer Case-Anweisung in Bash aus

Dieser Artikel untersucht reguläre Ausdrücke, ihre grundlegende Syntax und wie man sie mit einer case-Struktur und einer if-else-Struktur in Bash ausführt.

Einführung in reguläre Ausdrücke

Reguläre Ausdrücke, auch bekannt als regex oder regexp, sind eine Folge von Zeichen, die für den Text/String-Abgleich verwendet werden. Der regex kann sehr leistungsfähig sein und spart viel Zeit, wenn Sie Tonnen von Daten parsen müssen.

Obwohl Bash kein regex verwendet, verwendet es String-Matching, dessen Syntax dem von regex ähnelt. Das folgende Skript hilft Ihnen, sich mit den Grundlagen des String-Matching mit Bash vertraut zu machen.

?(a pattern list)
# Matches exactly zero or one instance of the pattern

*(a pattern list)
# This matches zero or more instances of the pattern.

+(a pattern list)
# This matches one or more instances of the pattern.

@(a pattern list)
# This matches one of the enclosed patterns.

!(a pattern list)
# This matches any pattern except the one enclosed.

Der obige Code-Fence zeigt die grundlegende regex-Syntax; Wenn Sie mehr über regex lesen möchten, besuchen Sie diesen Link.

Die Notwendigkeit, den komplexen Zeichenfolgenabgleich in Bash zu aktivieren

Standardmäßig können Sie in Bash einfache reguläre Ausdrücke ausführen; Bei komplizierten regulären Ausdrücken müssen Sie die Option extglob aktivieren. Die folgenden Befehle zeigen Ihnen, wie Sie extglob aktivieren oder deaktivieren, damit Sie komplizierte reguläre Ausdrücke ausführen können.

shopt -s extglob # this command enables extglob and allows the execution of complicated regex
shopt -u extglob # this command disables extglob and disables execution of complicated regex

Das extglob im obigen Befehl steht für Extended Globing. Wenn gesetzt, sind die komplexen/erweiterten Mustervergleichsfunktionen erlaubt, die unter Pfadnamenerweiterung angegeben sind.

Es muss beachtet werden, dass es unmöglich ist zu wissen, ob ein regulärer Ausdruck kompliziert ist, ohne ihn auszuführen. Aktivieren Sie die Option extglob, um sich Ärger zu ersparen und alle Ihre Befehle sorgenfrei auszuführen.

Eine Frage, die Sie vielleicht haben, ist, woher wir wissen, ob der extglob ein- oder ausgeschaltet ist. Siehe den folgenden Befehl als Referenz.

shopt | grep extglob # displays status of extglob

Ausgang:

extglob off # displays this line if extglob is disabled
extglob on # displays this line if extglob is enabled

Ermöglichen eines komplexen Zeichenfolgenabgleichs in Bash

Der obige Befehl zeigt den Status des extglob an, ob an oder aus.

String-Matching mit Regex in einer Case-Struktur

String-Matching (ähnlich wie regex) kann mit einer case-Struktur noch leistungsfähiger gemacht werden, die wir verwenden möchten, um uns zu erlauben, kompliziertere Daten zu parsen. Die folgenden Befehle führen Sie durch die Verwendung von case in Bash.

case EXPRESSION in
Match_1)
STATEMENTS # run this statement if in matches match_1
;;
Match_2)
STATEMENTS # run this statement if in matches match_2
;;
Match_N)
STATEMENTS # run this statement if in matches match_N
;;
*)
STATEMENTS # otherwise, run this statement
;;
Esac # signals the end of the case statement to the kernel

Der obige Code ist die generische Syntax, die Sie verwenden werden, falls Sie den Bash-String-Matching mit einer case-Struktur kombinieren möchten.

Bash erlaubt standardmäßig einen einfachen Musterabgleich. Beispielsweise wird der folgende Bash-Befehl erfolgreich ausgeführt.

cat sh*
# the above command displays the contents of all files whose name begins #with sh to the monitor (or stdout)

Wenn Sie jedoch den folgenden Befehl verwenden (der einen komplizierten Musterabgleich verwendet), erhalten Sie einen Fehler bash: Syntaxfehler in der Nähe des unerwarteten Tokens '('.

cat +([0-9]) # this command displays contents of files whose names are
# entirely composed of numbers

Fehler beim Deaktivieren von extglob

Wenn Sie weiter in die String-Übereinstimmung in Bash eintauchen möchten, verwenden Sie den folgenden Befehl.

man bash # man is a short form of manual pages here

Die Manpages sind ein Dienstprogramm, das verwendet werden kann, um Informationen zu jedem Bash-Befehl, Systemaufruf und vielem mehr zu finden.

Wenn Sie String-Matching mit einem case in Bash verwenden, empfiehlt es sich, zuerst eine Variable zu deklarieren und zu definieren, mit der Sie das Muster vergleichen.

Wir haben im folgenden Befehlsausschnitt einen Fall mit String-Matching verwendet. Beachten Sie, wie wir die Grundlagen des String-Matchings verwendet haben, um einen leistungsstarken String-Matching-Algorithmus zu generieren.

Schauen wir uns die Befehle an.

# Remember to not forget to enable extglob
shopt -s extglob # enables extglob
shopt | grep extglob # checks if extglob is enabled

some_variable="rs-123.host.com"; # declare and define variable
case $some_variable in
ab-+([0-9])\.host\.com) echo "First 2 characters were ab"
;;
ks-+([0-9])\.host\.com) echo "First 2 characters were ks"
;;
cs-+([0-9])\.host\.com) echo "First 2 characters were cs"
;;
*)echo "unknown first 2 characters"
;;
esac;
# the above command will display the unknown first 2 characters as we
# don't have a match in the first three cases, so the last default one will #automatically be true

Ausgang:

unknown first 2 characters

Wenn Sie den obigen String-Matching-Befehl analysieren, sind die ersten beiden Zeichen eines von (ab, ks, cs) und das nächste Zeichen ein Bindestrich (), gefolgt von einer beliebigen Anzahl von Ziffern und einer Endung bei .host.com ist einer der ersten drei Fälle erfolgreich und es wird eine entsprechende Meldung angezeigt.

Ist dies jedoch nicht der Fall, dann läuft der Default (also der Sonst-Fall) und wir erhalten eine Meldung: unknown first 2 characters.

Wir haben eine einfachere Lösung, wenn Sie die obigen Befehle zu kompliziert finden. Der folgende Befehl erklärt genau wie.

some_variable="rs-123.host.com"; # declare and define variable
case $some_variable in
ab*.host.com) echo "First 2 characters were ab"
;;
# the command below stays the same

Zeichenfolgenabgleich mit Regex

Der obige Befehl macht dasselbe wie die kompliziertere Case-Struktur, die wir oben verwendet haben.

String-Matching mit Regex in einer If-Else-Struktur

Eine andere Möglichkeit, leistungsstarke String-Matching-Algorithmen zu codieren, besteht darin, sie mit einer if-else-Struktur zu verwenden. Wir würden dies verwenden wollen, um kompliziertere Daten zu analysieren.

Der folgende Bash-Befehl führt Sie durch die Syntax einer if-else-Struktur.

if expression1
then
task1
elif expression2
then
task2
else
task3
fi # signals ending of if else structure

Das Arbeiten mit der if-else-Struktur ist einfach; Zuerst werten wir den ersten Ausdruck aus.

Wenn es true ist, führen wir Aufgabe 1 aus. Ansonsten betrachten wir den zweiten Ausdruck.

Wenn es true ist, dann führen Sie Aufgabe 2 aus. Ansonsten task3 ausführen.

Nachdem Sie nun mit der Syntax einer if-else-Struktur vertraut sind, wollen wir den in der case-Struktur verwendeten Befehl in eine äquivalente if-else-Struktur replizieren. Konsultieren Sie dazu den folgenden Befehl.

# Remember to not forget to enable extglob
shopt -s extglob # enables extglob
shopt | grep extglob # checks if extglob is enabled

some_variable="rs-123.host.com"; # declare and define variable
if expr "$some_variable" : ‘ab-+([0-9])\.host\.com’ >/dev/null; then echo "First 2 characters were ab"
elif expr "$some_variable" : ‘ks-+([0-9])\.host\.com’ >/dev/null; then echo "First 2 characters were ks"
elif expr "$some_variable" : ‘cs-+([0-9])\.host\.com’ >/dev/null; then echo "First 2 characters were cs"
else echo "unknown first 2 characters"
fi

# the above command will display the unknown first 2 characters as we
# don't have a match in the first three cases, so the last default one will #automatically be true

Ausgang:

unknown first 2 characters

Zeichenfolgenabgleich mit Regex in einem if else

Der obige Befehl ist das if-else-Äquivalent der case-Struktur, die wir zuvor verwendet haben.

Verwandter Artikel - Bash Regex