Je sais que l'on peut échapper à un caractère spécial comme *(){}$
avec \
afin d'être considéré comme des littéraux.
Par exemple \*
ou\$
Mais dans le cas où .
je dois le faire deux fois, comme \\.
sinon, il est considéré comme un caractère spécial. Exemple:
man gcc | grep \\.
Pourquoi en est-il ainsi?
shell-script
grep
regular-expression
quoting
escape-characters
Utilisateur enregistré
la source
la source
man bash|grep \\.
pourrait être un exemple.man gcc | grep '\.'
.Réponses:
En règle générale, vous ne devez vous échapper qu'une seule fois pour que le caractère spécial soit considéré comme littéral. Parfois, vous devez le faire deux fois, car votre modèle est utilisé par plusieurs programmes.
Discutons de votre exemple:
Cette commande est interprétée par deux programmes,
bash
interprète etgrep
. La première cause de fuitebash
sait\
est littérale, donc la seconde passegrep
.Si vous échapper qu'une seule fois,
\.
,bash
saura ce point est littérale, et de passer.
àgrep
. Lorsque vousgrep
voyez cela.
, il pense que le point est un caractère spécial, pas littéral.
Si vous vous échappez deux fois,
bash
passera le modèle\.
àgrep
.grep
Sachez maintenant que c'est un point littéral.la source
grep \\. my_file
. La ligne de commande est interprétée par le shell, en utilisant le premier\
pour échapper au second, donc l'un\
est passé littéralement à grep. Le point.
n'est pas spécial pour le shell, il est donc transmis textuellement de toute façon. Grep lit ensuite le (single)\
et l'utilise pour échapper au point.
.echo .
dans le bash juste ... fait écho au.
caractère bach .