web-dev-qa-db-fra.com

Comment faire correspondre les chiffres dans l'expression régulière

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?

31
Pawel P.

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
47
fedorqui

Notation numérique \d ne fonctionne pas avec votre version bash. Utilisation [0-9] au lieu:

regex="AAA \(bbb [0-9]+\) CCC"
7
anubhava