Primeiro, observe que a barra única corresponde demais:
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
No que diz respeito ao Bash , um período de escape é o mesmo que um período. Bash passa o período para grep . Para grep, um período corresponde a qualquer coisa.
Agora, considere:
$ 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\\\\.
$
Quando o Bash vê uma barra dupla, é reduzido a uma barra única e passa para grep que, no primeiro dos três testes acima, vê, como queremos, uma barra antes de um período. Assim, isso faz a coisa certa.
Com uma barra tripla, o Bash reduz os dois primeiros a uma barra simples. Então vê \.
. Como um período de escape não tem significado especial para o Bash, isso é reduzido para um período simples. O resultado é que o grep vê, como queremos, uma barra antes de um período.
Com quatro barras, o Bash reduz cada par a uma única barra. Bash passa para grep duas barras e um ponto. O grep vê as duas barras e um ponto final e reduz as duas barras a uma única barra literal . A menos que a entrada tenha uma barra literal seguida por qualquer caractere, não há correspondências.
Para ilustrar isso, lembre-se de que, entre aspas simples, todos os caracteres são literais. Assim, dadas as três linhas de entrada a seguir, o comando grep corresponde apenas na linha com a barra literal na entrada:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
Resumo do comportamento de Bash
Para o Bash, as regras são
Duas barras são reduzidas a uma única barra.
Uma barra na frente de um caractere normal, como um ponto final, é apenas o caractere normal (ponto final).
Portanto:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
Existe uma maneira simples de evitar toda essa confusão: na linha de comando do Bash, expressões regulares devem ser colocadas entre aspas simples. Dentro de aspas simples, Bash deixa tudo em paz.
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.
e daria grep,\.
mas não. boa pergunta