RegEx mit \ d funktioniert nicht in der if-else-Anweisung mit [[

7

Ich habe das folgende Skript geschrieben. Es wird später in einem Erstellungsprozess verwendet. Mein Ziel ist es zu entscheiden, ob es sich um eine Vorabversion oder eine Veröffentlichung handelt. Um dies zu archivieren, vergleiche ich $ release mit einem RegEx. Wenn mein RegEx übereinstimmt, handelt es sich um eine Vorabversion, wenn nicht, um eine Veröffentlichung.

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
if [[ "$release" =~ \d+\.\d+\.\d+[-]+.* ]];then
echo "Pre"
else
echo "Release"
fi

Aber als Ergebnis habe ich immer folgendes:

~$ bash releasescript.sh
1.9.2-alpha1
Release

Ausführung:

Ubuntu 18.04.1 LTS

Ich habe diesen Editor verwendet , um meine RegEx zu testen. Ich stecke mindestens 6 Stunden fest, daher würde ich mich über Hilfe sehr freuen.

venter
quelle

Antworten:

12

\dund \wkeine Arbeit in POSIX regulären Ausdrücken , können Sie verwenden , [[:digit:]]obwohl

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
LANG=C # This needed only if script will be used in locales where digits not 0-9
if [[ "$release" =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+-+ ]];then
echo "Pre"
else
echo "Release"
fi

Ich habe dieses Skript getestet, es gibt "Pre" für eine bestimmte $ -Version aus

Sie haben Ihren Regex-Builder überprüft. Er funktioniert nur mit Perl-kompatiblem und Javascript-Regex, während Sie Posix oder Posix Extended benötigen.

Von @dessert :

[0-9]ist die kürzere Alternative zu [[:digit:]]. Da der Anfang des Strings übereinstimmen soll, sollte man hinzufügen ^, während .*am Ende überflüssig ist: ^[0-9]+\.[0-9]+\.[0-9]+-+- Mit einer Gruppe kann dies weiter verkürzt werden auf:^([0-9]+\.){2}[0-9]+-+

LeonidMew
quelle
4
Schlage mich dazu! Wenn Sie fwiw verwendet shellcheckhaben, wird die Warnung "SC1001: Dies \ d wird in diesem Zusammenhang ein reguläres 'd' sein." Angezeigt, was sehr hilfreich ist. Andere Antworten .
pbhj
2
Entspricht [0-9] jedoch [[: digit:]]? Ich hatte den Eindruck, dass POSIX-Zeichenklassen mit Unicode-Zeichen übereinstimmen und daher sehr gut mit Ziffern in Sprachen übereinstimmen können, die keine 0-9 verwenden.
Fax
@Fax Nicht sicher, ob [0-9], aber [AZ] mit Unicode-Zeichen übereinstimmen. Die Art der Änderung wird nur vonLANG=C
LeonidMew
1
@Fax "Entspricht [0-9] jedoch [[: digit:]]?" Bis die Antwort nein ist .
Levant gescheckt