Когда я пишу
$ 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
нормальный символ.
echo \$
и затемecho \\$
ls \$
и увидеть, что мы получаем «ls: $: Нет такого файла или каталога», чтобы увидеть, что \ $ не экранирован в $, но \\ $ не экранирован в \ $, и так далее.Оболочка сначала расширяет любые управляющие последовательности перед передачей аргументов в программу, поэтому он интерпретирует
\$
как последовательность побега и передает один аргумент$
кgrep
, который соответствует концу строки. Поскольку каждая строка имеет конец, любая строка должна совпадать :)источник
man grep
; было решено , что$
соответствует концу строки, независимо от того , или нет линии отделены друг от друга\n
,\r
, как, или что - то совсем другое. В общем случае регулярные выражения могут использоваться для сопоставления с любой строкой, а не только с «строкой», и$
используются для сопоставления с концом строки.Это интерпретируется как метасимвол конца строки. Если вы хотите совпадать с реальным знаком доллара, сделайте
или
источник
^
для начала строки и$
для конца.или
будет соответствовать каждой строке, так что все, что вы печатаете, возвращается.
Пытаться
Теперь только строки, последний символ которых
a
будет сопоставляться и отображаться .источник
Вы можете избавиться от проблемы побега, если хотите искать литерал
$
, используя регулярное выражение для класса символов. Например,источник