J'essaie de faire correspondre certaines lignes avec l'expression régulière qui contient des chiffres.
Bash version 3.2.25:
#!/bin/bash
s="AAA (bbb 123) CCC"
regex="AAA \(bbb \d+\) CCC"
if [[ $s =~ $regex ]]; then
echo $s matches $regex
else
echo $s doesnt match $regex
fi
Résultat:
AAA (bbb 123) CCC doesnt match AAA \(bbb \d+\) CCC
Si je mets regex="AAA \(bbb .+\) CCC"
cela fonctionne mais il ne répond pas à mon exigence de faire correspondre les chiffres uniquement.
Pourquoi \d+
Ne correspond-il pas à 123
?
Utilisez un jeu de caractères standard ou une notation compatible POSIX:
[0-9]
[[:digit:]]
Comme lu dans Trouver uniquement les nombres au début d'un nom de fichier avec regex :
\d
et\w
ne fonctionne pas dans expressions régulières POSIX , vous pouvez utiliser[:digit:]
bien que
votre expression doit donc être l'une de celles-ci:
regex="AAA \(bbb [0-9]+\) CCC"
# ^^^^^^
regex="AAA \(bbb [[:digit:]]+\) CCC"
# ^^^^^^^^^^^^
Tous ensemble, votre script peut ressembler à ceci:
#!/bin/bash
s="AAA (bbb 123) CCC"
regex="AAA \(bbb [[:digit:]]+\) CCC"
if [[ $s =~ $regex ]]; then
echo "$s matches $regex"
else
echo "$s doesn't match $regex"
fi
Lançons-le:
$ ./digits.sh
AAA (bbb 123) CCC matches AAA \(bbb [[:digit:]]+\) CCC
Notation numérique \d
ne fonctionne pas avec votre version bash. Utilisation [0-9]
au lieu:
regex="AAA \(bbb [0-9]+\) CCC"