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}
?
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:
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'
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).