Когда я пишу
$ grep \$
тогда все, что я печатаю на терминале, сопоставляется и печатается на терминале. Как интерпретируется \$
?
Когда я пишу
$ grep \$
тогда все, что я печатаю на терминале, сопоставляется и печатается на терминале. Как интерпретируется \$
?
Оболочка интерпретирует \$
и передает его в 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
считал его нормальным символом.
Оболочка сначала раскрывает все escape-последовательности перед передачей аргументов программе, поэтому она интерпретирует \$
как escape-последовательность и передает единственный аргумент $
в grep
, который соответствует концу строки. Поскольку каждая строка имеет конец, любая строка должна совпадать :)
Это интерпретируется как метасимвол конца строки. Если вы хотите совпадать с реальным знаком доллара, сделайте
$ grep \\$
или же
$ grep '\$'
^
для начала строки и $
для конца.
grep \$
или же
grep $
будет соответствовать каждой строке, так что все, что вы печатаете, отражается обратно.
Пытаться
grep a$
Теперь, только строки , чьи последний символ a
будет соответствовать и эху.
Вы можете избавиться от проблемы побега, если хотите найти литерал $
, используя регулярное выражение для класса символов. Например,
$ grep '[$]' file