Tout d'abord, notez que la barre oblique correspond trop:
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
En ce qui concerne Bash , une période échappée est identique à une période. Bash passe la période à grep . Pour grep, un point correspond à n'importe quoi.
Maintenant, considérez:
$ echo $'eegg \n e.g.' | grep e\\.g\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\.g\\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\\.g\\\\.
$
Lorsque Bash voit une double barre oblique, il la réduit à une seule barre oblique et la transmet à grep qui, dans le premier des trois tests ci-dessus, voit, comme nous le voulons, une seule barre oblique avant un point. Ainsi, cela fait la bonne chose.
Avec une triple barre oblique, Bash réduit les deux premiers à une seule barre oblique. Il voit alors \.
. Puisqu'une période échappée n'a pas de signification particulière pour Bash, elle est réduite à une période simple. Le résultat est que grep voit, comme nous voulons, une barre oblique avant une période.
Avec quatre barres obliques, Bash réduit chaque paire en une seule barre oblique. Bash passe à grep deux slashs et un point. grep voit les deux barres obliques et un point et réduit les deux barres obliques à une seule barre oblique littérale . À moins que l'entrée n'ait une barre oblique suivie d'un caractère, il n'y a pas de correspondance.
Pour illustrer ce dernier, rappelez-vous que dans les guillemets simples, tous les caractères sont littéraux. Ainsi, étant donné les trois lignes d'entrée suivantes, la commande grep correspond uniquement sur la ligne avec la barre oblique littérale dans l'entrée:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
Résumé du comportement de Bash
Pour Bash, les règles sont
Deux barres obliques sont réduites à une seule barre oblique.
Une barre oblique devant un caractère normal, comme un point, n'est que le caractère normal (point).
Donc:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
Il existe un moyen simple d'éviter toute cette confusion: sur la ligne de commande Bash, les expressions régulières doivent être placées entre guillemets simples. Dans des guillemets simples, Bash laisse tout seul.
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.
et donnerait du grep\.
mais ce n'est pas le cas. bonne question