Когда я пишу
$ 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 '[$]' file