web-dev-qa-db-fra.com

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

Vous avez cherché une solution sur SO, Ask et Unix/Linux, mais je suis perdu à essayer de comprendre comment écrire une condition avec une plage de grep:

Traverser:

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

Quel est le meilleur moyen de parcourir {1,3}?

MODIFIER:

Pour aider la prochaine personne susceptible de se heurter à ce problème, j'ai fait beaucoup de recherches et, une fois les réponses données, j'ai pu obtenir:

2

Les accolades {} sont traitées comme des littéraux dans BRE (Expression Régulière Basique). 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 \).

Donc vous avez besoin soit

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

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

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

Votre deuxième tentative devrait fonctionner si vous avez activé PCRE (expressions régulières compatibles Perl) avec -P:

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

\d n'est ni dans BRE, ni ERE, ni dans la liste des expressions de barre oblique inverse supplémentaires que GNU Grep a, mais c'est un élément 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).

2
muru