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


Ответы:


18

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

Если вы хотите соответствовать фактическому $в 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
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

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

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


1
чтобы проверить, что видит grep, попробуйте echo \$и затемecho \\$

В grep \\\ $, как вы сказали, \ $ передается в grep, поэтому он должен соответствовать строкам, которые содержат \ $, но почему он соответствует тем строкам, которые содержат только $?

Потому что $ в grep означает конец строки. Чтобы соответствовать символу $, вам нужно экранировать его, чтобы grep не обращался с ним специально. Смотрите мое обновление.

@Pasi: echo делает свое собственное эскейпинг, в зависимости от того, встроен он в оболочку или нет, POSIX-совместим или нет, и т. Д. Лучше использовать (IMHO) ls \$ и увидеть, что мы получаем «ls: $: Нет такого файла или каталога», чтобы увидеть, что \ $ не экранирован в $, но \\ $ не экранирован в \ $, и так далее.
Хенно

5

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


Но как $ это конец строки? Разве конец строки не равен \ n?

2
@ Счастливый Mithal: Видите man grep; было решено , что $соответствует концу строки, независимо от того , или нет линии отделены друг от друга \n, \r, как, или что - то совсем другое. В общем случае регулярные выражения могут использоваться для сопоставления с любой строкой, а не только с «строкой», и $используются для сопоставления с концом строки.

2

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

 $ grep \\$ 

или

 $ grep '\$' 

1

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

grep \$

или

grep $

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

Пытаться

grep a$

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


1

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

$ grep '[$]' file
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.