Führen Sie reguläre Ausdrücke in einer Case-Anweisung in Bash aus
- Einführung in reguläre Ausdrücke
- Die Notwendigkeit, den komplexen Zeichenfolgenabgleich in Bash zu aktivieren
-
String-Matching mit Regex in einer
Case
-Struktur -
String-Matching mit Regex in einer
If-Else
-Struktur
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
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
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
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
Der obige Befehl ist das if-else
-Äquivalent der case
-Struktur, die wir zuvor verwendet haben.