странное поведение grep в UNIX

Когда я ввожу команду

$ grep \\\\h junk  

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

Но это не работает на \\\\$. Почему?

2
задан 06.04.2012, 22:48

7 ответов

К возвратным линиям со знаком доллара, иначе без Escape:

grep "[$]" file

Найти строки с литералом \$:

grep "[\][$]" file
6
ответ дан 08.12.2019, 04:43

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

grep "\\$" application/bootstrap.php

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

2
ответ дан 08.12.2019, 04:43

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

$ cat file
\a
a

$ grep \\a file
\a
a

$ grep \\\\a file
\a
1
ответ дан 08.12.2019, 04:43

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

[$]

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

[\\][$]

сделает это.

1
ответ дан 08.12.2019, 04:43

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

0
ответ дан 08.12.2019, 04:43

\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 ingrep \\файл $, 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 сделает, а не об оболочке также.

1
ответ дан 08.12.2019, 04:43

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

0
ответ дан 08.12.2019, 04:43

Теги

Похожие вопросы