12

Когда я пишу

$ grep \$  

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

5 ответов5

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 считал его нормальным символом.

5

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

2

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

 $ grep \\$ 

или же

 $ grep '\$' 
1

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

grep \$

или же

grep $

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

Пытаться

grep a$

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

1

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

$ grep '[$]' file

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