\h не является специальным выходом для grep, поэтому '\h' должен найти \h в файле, что он и делает.
Оболочка удаляет первый \ до того, как grep его увидит, поскольку \ является особенным (наберите ls \\
и скажет ls:: такой файл или каталог). Таким образом, чтобы соответствовать «\h» в файле, используйте grep \h или «\h», чтобы избежать первого \ -> \ сокращения оболочкой.
Теперь \ $: \ сокращается до \ оболочкой, и grep видит \ $, и поскольку $ является особенным в регулярных выражениях (например, +,., * И т.д.), \ $ Является буквальным знаком доллара, как показывает простой тестовый файл. вы. Смотрите справочную страницу для re_format (7). Так что это соответствует всем строкам со знаком доллара.
Поэтому, если вы хотите сопоставить литерал "\ $" в файле, нам нужно подумать: оболочка \ $ не экранирована в литерал $, и \ to: try 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 \\\\ $ file`. Это работает.
Вот почему я почти всегда помещаю одинарные кавычки вокруг первого аргумента grep, поэтому мне остается только думать о том, что будет делать grep, а не об оболочке.