2 votes

Pourquoi ma condition de répétition avec grep range ne fonctionne-t-elle pas ?

J'ai cherché une solution sur SO, Ask et Unix/Linux mais je suis perdu en essayant de comprendre comment écrire une conditionnelle avec une plage grep :

Passez par là :

1-20_something
100-200_something
2-100_something
11-333_something

Le code fonctionne mais seulement sur 1-9_something :

if grep -q '[0-9]-[0-9]_something' "$foobar"; then
    echo "Additional Code"
fi

ne fonctionne pas :

if grep -q '\d{1,3}-\d{1,3}_something' "$foobar"; then
    echo "Additional Code"
fi

et ça ne marche pas :

if grep -q '[0-9]{1,3}-[0-9]{1,3}_something' "$foobar"; then
    echo "Additional Code"
fi

Quelle est la meilleure façon de passer à travers {1,3} ?

EDIT :

Pour aider la prochaine personne qui pourrait rencontrer ce problème, j'ai fait beaucoup de recherches et après les réponses données, j'ai pu obtenir un résultat :

3voto

steeldriver Points 118154

Crochets bouclés { } sont traités comme des littéraux dans BRE (Basic Regular Expression). À partir de man grep :

   Basic vs Extended Regular Expressions
       In  basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their
       special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

Vous devez donc soit

grep '[0-9]\{1,3\}-[0-9]\{1,3\}_something'

ou activer le mode Expression régulière étendue avec l'option -E commutateur

grep -E '[0-9]{1,3}-[0-9]{1,3}_something'

2voto

muru Points 180007

Votre deuxième tentative devrait fonctionner si vous avez activé les PCRE (expressions régulières compatibles avec Perl) à l'aide de la commande -P :

grep -Pq '\d{1,3}-\d{1,3}_something'

\d n'est pas dans BRE ou ERE ou dans la liste de expressions supplémentaires avec antislash que GNU Grep a, mais c'est une chose Perl.

Votre troisième tentative devrait fonctionner si vous avez activé ERE (expressions régulières étendues) :

grep -Eq '[0-9]{1,3}-[0-9]{1,3}_something'

<exp>{m,n} n'est pas une construction BRE (expression régulière de base).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X