Wie verwende ich reguläre Ausdrücke in Bash-Skripten?


83

Ich möchte mithilfe eines regulären Ausdrucks überprüfen, ob eine Variable ein gültiges Jahr hat. Wenn ich das Bash-Handbuch lese, kann ich den Operator = ~ verwenden

Wenn ich mir das folgende Beispiel anschaue, würde ich erwarten, dass "nicht OK" angezeigt wird, aber ich sehe "OK". Was mache ich falsch?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi

mögliches Duplikat von Bash Regex mit Anführungszeichen?
Outis

Beachten Sie, dass dies aufgrund des Platzmangels fehlschlug =~.
Fedorqui 'SO hör auf,'

Antworten:


116

Es wurde zwischen 3.1 und 3.2 geändert:

Dies ist eine knappe Beschreibung der neuen Funktionen, die seit der Veröffentlichung von bash-3.1 zu bash-3.2 hinzugefügt wurden.

Das Zitieren des Zeichenfolgenarguments für den Operator [[Befehl = ~] erzwingt jetzt den Zeichenfolgenabgleich wie bei den anderen Operatoren für den Mustervergleich.

Verwenden Sie es also ohne die Anführungszeichen wie folgt:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi

1
Wie gehe ich mit der Situation um, in der der reguläre Ausdruck Leerzeichen enthält, wenn ich nicht zitieren kann? Wenn die Regex zB ist a +b, wird ein Syntaxfehler
gemeldet

5
@Alderath: Verwenden Sie diese Option a\ \+b, um dem Leerzeichen und dem Pluszeichen zu entkommen.
blinry

8

Sie benötigen Leerzeichen um den Operator = ~

i = "Test"
if [[$ i = ~ "200 [78]"]];
dann
  Echo "OK"
sonst
  Echo "nicht OK"
fi

3
Die Antwort von paxdiablo ist richtig, das Hinzufügen von Leerzeichen hier hilft nicht (Sie erhalten jetzt auch "nicht OK" für 2008, die einzige Zeichenfolge, die übereinstimmt, ist buchstäblich "200 [78]").
Marcel Stimberg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.