2

Когда я набираю команду

$ grep \\\\h junk  

тогда оболочка должна интерпретировать \\\\h как \\h - так как две пары \\ каждой становятся \ . grep в свою очередь, должен интерпретировать \\h как \h как \\ становится \ , поэтому grep должен найти шаблон \h в junk , что он и делает успешно.

Но это не работает за \\\\$ . Зачем?

7 ответов7

6

Чтобы вернуть строки со знаком доллара, другой способ без экранирования:

grep "[$]" file

Чтобы найти строки с литералом \$:

grep "[\][$]" file
2

Возвращает только строки со знаком доллара.

grep "\\$" application/bootstrap.php

Поскольку $ также является командой регулярных выражений (конец строки), вы должны заключить ее в кавычки, чтобы получить двойную косую черту после вашей оболочки и войти в grep.

1

Grep всегда использует \, чтобы заключить следующий символ в кавычки, поэтому \h просто становится h в вашем примере, так как \h не является "специальным":

$ cat file
\a
a

$ grep \\a file
\a
a

$ grep \\\\a file
\a
1

\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, а не об оболочке.

1

Предполагая, что вы пытаетесь сопоставить символ '$', шаблон:

[$]

это самый простой способ указать его, не запутавшись в нескольких уровнях экранирования символов. Или, если вы пытаетесь сопоставить два символа: «\$», то

[\\] [$]

сделаю это.

0

Ваша оболочка интерпретирует \\ как \ , а $ как первый символ некоторых управляющих последовательностей, таких как имена переменных. Следовательно, \\\\ интерпретируется вашей оболочкой как литерал \\ (как вы думаете), но $ необходимо экранировать, чтобы интерпретировать как буквальный символ. Используйте \\\\\\\$ (семь обратных косых черт) или '\\\$' (текст в апострофах интерпретируется буквально оболочкой).

0

Почему ты не можешь просто сделать grep '\\$'? Одинарные кавычки предотвращают почти всю интерполяцию.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .