2017-06-22 5 views
1

Ich brauche ein, um Muster zu finden, die 6 Ziffern sind und die ersten 3 Ziffern sind spezifische Ziffern, aber die restlichen 3 Ziffern sind eine beliebige Ziffer. Zum Beispiel 6-stellige Strings, beginnend mit 123 gefolgt von 3 Ziffern.Bash Skript Mustererkennung

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

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

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

Antwort

3

Mit glob Pattern-Matching, Verwenden Sie eine Zeichenklasse: [0-9] entspricht 0, 9, und jedes Zeichen zwischen ihnen im Zeichensatz, die aus den Ziffern 1 bis 8 bestehen. In Unicode- und Subset-Zeichensätzen (US-ASCII, Latin-1, UTF-8) werden alle 10 lateinischen Ziffern abgeglichen.

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

regulären Ausdruck („regex“) anstelle von glob passende passende, können Sie das Muster etwas verkürzen kann:

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

Mit =~, nur die Regex einen Teil der Zeichenfolge übereinstimmen muss, nicht die ganze Sache. Sie brauchen also nicht das Äquivalent der führenden und nachgestellten * s, die Sie im glob-Muster finden.

Mit der Syntax {n} können Sie eine genaue Anzahl von Wiederholungen des vorherigen Musters angeben, sodass Sie das Muster selbst in der Regex nicht wiederholen müssen. Sie können auch einen beliebigen Bereich von Wiederholungszählungen anpassen, indem Sie ein Minimum und ein Maximum angeben, z. B. [0-9]{2,4}, um entweder zwei, drei oder vier Ziffern hintereinander zuzuordnen.

Schließlich könnten Sie auch eine benannte Zeichenklasse verwenden, um Ziffern zu finden. Je nach Ihrem Gebietsschema kann [[:digit:]] exakt mit [0-9] übereinstimmen oder Zeichen aus anderen Skripts mit der Unicode-Eigenschaft "Number, Decimal Digit" enthalten.

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

Schön gemacht. Quibble: '[0-9]' stimmt mit den Zeichen im Bereich von '0' bis '9' _ überein, die durch den (effektiven) 'LC_CTYPE'-Wert_ definiert sind (siehe 'locale'). In den nun allgegenwärtigen UTF-8-basierten Sprachumgebungen stimmt dies mit den ASCII/Latin-1-Zeichen "0" bis "9" überein, da diese Kodierungen echte _subsets_ von Unicode sind. Im Gegensatz dazu stimmt '[[: digits:]]' 'nicht nur mit' 0' bis '9' überein, sondern mit _additional_ characters in UTF-8, je nachdem, was der Unicode-Standard als Ziffer betrachtet. – mklement0

1

Bash glob Pattern-Matching[0-9] kann verwendet werden, Ziffer entsprechen:

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

Alternativ können Sie RegexMuster verwenden passende mit =~:

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