En général, quels caractères d'une expression régulière doivent s'échapper?
Par exemple, ce qui suit n'est pas syntaxiquement correct:
echo '[]' | grep '[]'
grep: Unmatched [ or [^
Ceci, cependant, est correct sur le plan statistique:
echo '[]' | grep '\[]'
[]
Existe-t-il une documentation sur les caractères qui devraient être échappés dans une expression régulière et ceux qui ne devraient pas?
la source
bash
inclus),!
est toujours développé entre guillemets doubles, seuls les guillemets simples arrêteront son expansion (ou désactiveront l'option shell).]
ne doit pas être cité,[
pas toujours. Je n'ai trouvé aucune référence à{
et}
Il existe plusieurs types d'expressions régulières et l'ensemble de caractères spéciaux dépend du type particulier. Certains d'entre eux sont décrits ci-dessous. Dans tous les cas, les caractères spéciaux sont échappés par une barre oblique inverse
\
. Par exemple, pour correspondre à[
vous écrivez à la\[
place. Alternativement, les caractères (sauf^
) pourraient être échappés en les enfermant entre crochets comme un par un[[]
.Les caractères qui sont spéciaux dans certains contextes comme
^
spécial au début d'une (sous-) expression peuvent être échappés dans tous les contextes.Comme d'autres l'ont écrit: dans le shell si vous ne placez pas l'expression entre guillemets simples, vous devez également échapper les caractères spéciaux pour le shell dans l'expression régulière déjà échappée. Exemple: au lieu de
'\['
vous pouvez écrire\\[
(alternativement:"\["
ou"\\["
) dans des shells compatibles Bourne comme bash mais c'est une autre histoire.Expressions régulières de base (BRE)
grep
,sed
.[\
*^$
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
Expressions régulières étendues (ERE)
grep -E
GNUsed -r
:, * BSD:sed -E
.[\(
*^$)+?{|
"$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
la source
grep
utilise BRE comme méthode d'expression régulière. Il y a une bonne documentation sur elle ici , un aperçu général serait « échapper à un caractère spécial ou métacaractère pour obtenir son littéral, échapper pour créer des séquences d'échappement (\n
,\r
, etc.) », bien que ce soit pas toujours vrai, par exemple, vous devez s'échapper(
et)
obtenir leur signification particulière (référence).la source
Le shell peut transformer la ligne de commande avant l'exécution de la commande. Le shell et
grep
peut utiliser des guillemets pour supprimer la signification spéciale de certains caractères. Néanmoins, lesgrep
obus ont différents caractères spéciaux. De plus, les caractères spéciaux non échappés qui ne résultaient pas d'une extension existante sont supprimés, avant l'exécution de la commande, par le shell.Le shell transmet l'argument
[]
àgrep
et il est analysé comme une expression de crochet mal formée pargrep
.Ci-dessus, nous pouvons voir un cas similaire. La barre oblique inverse est supprimée et
[]
est transmise comme argument àgrep
.grep
reconnaît une expression de crochet mal formée.Enfin, dans ce cas, les guillemets sont supprimés par le shell et
\[]
transmis comme argument àgrep
mais, dans ce cas spécifique ¹,\[
est interprété pargrep
comme une parenthèse littérale. Des citations sont nécessaires pour empêcher l'interprétation de la barre oblique inverse comme un caractère spécial par le shell.¹ Spécification POSIX .
la source