Как интерпретируется \ $ с помощью grep?

10636
Happy Mittal

Когда я пишу

$ grep \$ 

тогда все, что я печатаю на терминале, сопоставляется и печатается на терминале. Как \$интерпретируется?

12

5 ответов на вопрос

18

Оболочка интерпретирует \$и передавая ее через к ГРЭП, как $, в конце строки. Итак, если ваша строка имеет конец, она будет соответствовать :-)

Если вы хотите соответствовать фактическому $в grep, используйте одно из:

grep \\\$ grep '\$' 

В первом случае оболочка интерпретируется \\как \и \$как $, давая \$. В последнем случае это совсем не интерпретируется.


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

$ end of line ^ start of line . any character + 1 or more of the preceeding pattern * 0 or more of the preceeding pattern between n and m of the preceeding pattern [x-y] any character between x and y (such as [0-9] for a digit). 

наряду со многими другими.

Если вы хотите сопоставить символ литерлы, который обычно рассматривается как специальный символ, вам нужно экранировать его, чтобы он воспринимался как grepнормальный символ.

чтобы проверить, что видит grep, попробуйте `echo \ $`, а затем `echo \\ $` 14 лет назад 1
В grep \\\ $, как вы сказали, \ $ передается в grep, поэтому он должен соответствовать строкам, которые содержат \ $, но почему он соответствует тем строкам, которые содержат только $? 14 лет назад 0
Потому что $ в grep означает конец строки. Чтобы соответствовать символу $, вам нужно экранировать его, чтобы grep не обращался с ним специально. Смотрите мое обновление. 14 лет назад 0
@Pasi: echo делает свое собственное эскейпинг, в зависимости от того, встроен он в оболочку или нет, POSIX-совместим или нет, и т. Д. Лучше (IMHO) использовать `ls \ $` и видеть, что мы получаем "ls: $: Нет такого файл или каталог ", чтобы увидеть, что \ $ не экранирован в $, но \\ $ не экранирован в \ $, и так далее. Henno 14 лет назад 0
5
Nick Meyer

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

Но как $ это конец строки? Разве конец строки не равен \ n? 14 лет назад 0
@ Счастливый Mithal: см. "Человек Grep"; было решено, что `$` совпадает с концом строки, независимо от того, разделены ли строки `\ n`,` \ r`, обоими или чем-то совершенно другим. В общем случае регулярные выражения могут использоваться для сопоставления с любой строкой, а не только с «строкой», а `$` используется для сопоставления с концом строки. 14 лет назад 2
2

Это интерпретируется как метасимвол конца строки. Если вы хотите совпадать с реальным знаком доллара, сделайте

 $ grep \\$ 

или же

 $ grep '\$' 
1
N 1.1

^для начала строки и $для конца.

grep \$ 

или же

grep $ 

будет соответствовать каждой строке, так что все, что вы печатаете, отражается обратно.

Пытаться

grep a$ 

Теперь только строки, последний символ которых aбудет сопоставляться и отображаться .

1
user31894

Вы можете избавиться от проблемы побега, если хотите искать литерал $, используя регулярное выражение для класса символов. Например,

$ grep '[$]' file 

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