web-dev-qa-db-fra.com

Correspondance de modèle de script Bash

Il me faut un pour trouver des modèles à 6 chiffres et les 3 premiers chiffres sont des chiffres spécifiques, mais les 3 derniers chiffres seront des chiffres quelconques .Par exemple, des chaînes de 6 chiffres commençant par 123 suivies de 3 chiffres.

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

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

Où ddd sont des chiffres. var1 et var2 correspondraient au modèle mais pas la var 3. Je n'arrive pas à comprendre.

4
Bdgisme

Utilisez une classe de caractères: [0-9] correspond à 0, 9 et tous les caractères qui les séparent dans le jeu de caractères, qui - au moins dans les jeux de caractères Unicode et sous-jeux (US-ASCII, Latin-1, UTF-8) - correspondent aux chiffres 1 à 8. Donc, il correspond à l'un des 10 chiffres latins.

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

L'utilisation de =~ au lieu de == modifie le type de modèle des modèles "glob" standard de Shell en expressions régulières ("regexes" en abrégé). Vous pouvez faire un regex équivalent un peu plus court:

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

Le premier raccourci vient du fait qu’une expression rationnelle ne doit correspondre qu’à une partie de la chaîne, pas à la totalité. Par conséquent, vous n'avez pas besoin de l'équivalent des *s de début et de fin que vous trouvez dans le modèle glob. 

La deuxième réduction de longueur est due à la syntaxe {n}, qui vous permet de spécifier un nombre exact de répétitions du motif précédent au lieu de répéter le motif lui-même dans la regex. (Vous pouvez également faire correspondre un nombre de comptes de répétition en spécifiant un minimum et un maximum, tels que [0-9]{2,4} pour faire correspondre deux, trois ou quatre chiffres à la suite.)

Il est à noter que vous pouvez également utiliser une classe de caractères nommés pour faire correspondre les chiffres. [[:digit:]] peut être exactement équivalent à [0-9], ou peut inclure des caractères d'autres scripts dotés de la propriété Unicode "Nombre, chiffre décimal".

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

Bash glob pattern matching [0-9] peut être utilisé pour faire correspondre le chiffre:

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

Alternativement, vous pouvez utiliser motif de correspondance regex avec =~:

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