Во-первых, обратите внимание, что одиночная косая черта слишком сильно совпадает:
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
Что касается Bash , то экранированный период совпадает с периодом. Bash проходит на период, чтобы grep . Для grep точка соответствует чему угодно.
Теперь рассмотрим:
$ 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\\\\.
$
Когда Bash видит двойную косую черту, он уменьшает ее до одной косой черты и передает ее на grep, который в первом из трех тестов, приведенных выше, видит, как мы хотим, одну косую черту перед точкой. Таким образом, это правильно делает.
С тройной косой чертой Bash уменьшает первые две до одной косой черты. Затем он видит \.
. Поскольку экранированный период не имеет особого значения для Bash, он сводится к обычному периоду. В результате grep видит, как мы хотим, косую черту перед точкой.
С четырьмя слешами Bash уменьшает каждую пару до одного слеша. Bash передает grep две косые черты и точку. grep видит две косые черты и точку и уменьшает две косые черты до одного буквального слеша. Если за вводом нет буквального слеша, за которым следует какой-либо символ, совпадений нет.
Чтобы проиллюстрировать это последнее, помните, что внутри одинарных кавычек все символы являются буквальными. Таким образом, учитывая следующие три входные строки, команда grep совпадает только в строке с буквенной косой чертой во входных данных:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
Краткое изложение поведения Баша
Для Bash правила
Две косые черты уменьшаются до одной косой черты.
Косая черта перед нормальным символом, например точка, является просто нормальным символом (точка).
Таким образом:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
Существует простой способ избежать этой путаницы: в командной строке Bash регулярные выражения следует помещать в одинарные кавычки. Внутри одинарных кавычек, Bash оставляет все в покое.
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.
и даст grep,\.
но это не так. Хороший вопрос