当我写作时
$ grep \$
那么无论我在终端上输入什么,都会被匹配并打印在终端上。如何\$
解释?
答案1
这壳正在解释并将其作为行尾字符\$
传递给 grep 。因此,假设您的行有一个结尾,它将匹配 :-)$
如果要$
在 grep 中匹配实际值,请使用以下之一:
grep \\\$
grep '\$'
在前者中,shell 将 解释\\
为\
并将解释为,\$
从而得到。在后者中,它根本不解释它。$
\$
至于你为什么\$
匹配美元符号而不是两个字符序列的问题,像在中使用的正则表达式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
将其视为普通字符。
答案2
在将参数传递给程序之前,shell 首先会扩展所有转义序列,因此它将 解释\$
为转义序列,并将单个参数传递给$
,grep
该参数与行尾匹配。由于每行都有结尾,因此任何行都应该匹配 :)
答案3
它被解释为行尾元字符。如果你想匹配一个实际的美元符号,请执行
$ grep \\$
或者
$ grep '\$'
答案4
如果要搜索文字$
,可以使用字符类的正则表达式来省去转义的麻烦。例如,
$ grep '[$]' file