Когда я ввожу команду
$ grep \\\\h junk
затем оболочка должна интерпретировать \\\\h
как \\h
- как две пары \\
каждый становится \
. grep
в свою очередь, должен интерпретировать \\h
как \h
как \\
становится \
, так grep
должен искать шаблон \h
в junk
, который это делает успешно.
Но это не работает на \\\\$
. Почему?
К возвратным линиям со знаком доллара, иначе без Escape:
grep "[$]" file
Найти строки с литералом \$
:
grep "[\][$]" file
Grep всегда использует \для заключения в кавычки следующего символа, таким образом, \h просто становится h в примере, так как \h не является "особенным":
$ cat file
\a
a
$ grep \\a file
\a
a
$ grep \\\\a file
\a
Принятие Вас пытается соответствовать символьному '$', шаблону:
[$]
самый легкий путь состоит в том, чтобы указать его, не попадая в историю на нескольких уровнях символьных Escape. Или при попытке соответствовать этим двум символам: $ '\', затем
[\\][$]
сделает это.
Ваша оболочка интерпретирует \\
как \
, и $
как первый символ некоторых управляющих последовательностей, как имена переменной. Поэтому \\\\
интерпретируется Вашей оболочкой как литерал \\
(как Вы думаете), но $
потребности, которых оставят, чтобы быть интерпретированным как буквенный символ. Использовать \\\\\\\$
(семь обратных косых черт) или '\\\$'
(текст в апострофах интерпретируется буквально оболочкой).
\h не является специальным Escape для grep, таким образом, '\h' должен найти \h в файле, который он делает. Оболочка удаляет первое \, прежде чем grep будет видеть его, поскольку \является особенным (тип ls \\
и это говорит ls:: Так такой файл или каталог). Таким образом для соответствия "\h" в файле используйте grep \h, или '\h' для предотвращения первого \-> \сокращение оболочкой.
Теперь \$: \уменьшается до \оболочкой, и grep видит \$ и потому что $ является особенным в regexes (как +., * и т.д.), \$ является литеральным знаком доллара, поскольку простой тестовый файл покажет Вам. См. страницу справочника для re_format (7). Таким образом, это соответствует всем строкам знаку доллара.
Таким образом, если Вы хотите соответствовать литералу "\$" в файле, мы должны думать: \$ не завершен оболочкой к литеральному $, и \к: попробовать ls \\\$' and you get "ls: \$: No such file or directory". So in
grep \\файл $, grep sees \$ and interprets that as $ again... So we want grep to see \\\$ (which it will unescape again to \$), so we can put single quotes around that and avoid headaches, or escape all the special characters for the shell too:
grep \\\\файл $'. Это работает.
Вот почему я почти всегда помещал одинарные кавычки вокруг первого grep аргумента, таким образом, я только должен думать о том, что grep сделает, а не об оболочке также.