it-swarm.com.de

Bash-Skriptmusterabgleich

Ich brauche a, um Muster zu finden, die 6-stellig sind, und die ersten 3 Ziffern sind bestimmte Ziffern, die restlichen 3 Ziffern sind jedoch beliebige Ziffern .. _. Beispiel: 6-stellige Zeichenfolgen, die mit 123 beginnen, gefolgt von 3-stelligen Ziffern.

var1="abc,123111,"
var2="abcdefg,123222,"
var3="xyzabc,987111,"

if [[ $var1 == *",123ddd,"* ]] ; then echo "Pattern matched"; fi

Wo ddd irgendwelche Ziffern sind. var1 und var2 würden dem Muster entsprechen, var 3 jedoch nicht. Ich kann es einfach nicht richtig verstehen.

4
Bdgisme

Verwenden Sie eine Zeichenklasse: [0-9] stimmt mit 0, 9 und jedem Zeichen im Zeichensatz überein, das - zumindest in Unicode- und Teilmengenzeichensätzen (US-ASCII, Latin-1, UTF-8) - die Ziffern 1 bis ist 8. Es passt also zu einer der 10 lateinischen Ziffern.

if [[ $var1 == *,123[0-9][0-9][0-9],* ]] ; then echo "Pattern matched"; fi

Wenn Sie =~ anstelle von == verwenden, wird der Mustertyp von "Glob" -Mustern der Shell-Norm in reguläre Ausdrücke ("reguläre Ausdrücke") geändert. Sie können einen gleichwertigen Regex etwas kürzer machen:

if [[ $var1 =~ ,123[0-9]{3}, ]] ; then echo "Pattern matched"; fi

Die erste Verkürzung ergibt sich aus der Tatsache, dass ein Regex nur mit einem Teil der Zeichenfolge übereinstimmen muss, nicht mit dem ganzen. Daher benötigen Sie nicht das Äquivalent des führenden und des nachlaufenden *s, das Sie im Glob-Muster finden. 

Die zweite Längenreduzierung ist auf die {n}-Syntax zurückzuführen, mit der Sie eine genaue Anzahl von Wiederholungen des vorherigen Musters angeben können, anstatt das Muster selbst in der Regex zu wiederholen. (Sie können auch einen beliebigen Bereich von Wiederholungszählern abgleichen, indem Sie ein Minimum und ein Maximum angeben, z. B. [0-9]{2,4}, um entweder zwei, drei oder vier Ziffern in einer Zeile zu finden.)

Es ist erwähnenswert, dass Sie auch eine benannte Zeichenklasse verwenden können, um die Ziffern abzugleichen. Abhängig von Ihrem Gebietsschema kann [[:digit:]] exakt äquivalent zu [0-9] sein oder Zeichen aus anderen Skripts mit der Unicode-Eigenschaft "Number, Decimal Digit" enthalten.

if [[ $var1 =~ ,123[[:digit:]]{3}, ]] ; then echo "Pattern matched"; fi
8
Mark Reed

Bash Glob Pattern Matching [0-9] kann verwendet werden, um die Ziffer abzugleichen:

if [[ $var1 == *,123[0-9][0-9][0-9],* ]] ; then echo "Pattern matched"; fi

Alternativ können Sie regex Mustervergleich mit =~ verwenden:

if [[ $var1 =~ .*,123[0-9]{3},.* ]] ; then echo "Pattern matched"; fi
0
zhenguoli