grep如何解释\ $?


Answers:


18

所述外壳被解释\$并使其通过以作为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将其视为普通字符。


1
测试grep看到的内容,echo \$然后尝试echo \\$

正如您所说,在grep \\\ $中,\ $被传递给grep,因此它应该匹配包含\ $的字符串,但是为什么匹配那些仅包含$的字符串呢?

因为grep中的$表示行尾。要匹配字符$,您需要对其进行转义,因此grep不会对其进行特殊处理。查看我的更新。

@Pasi:echo会自行进行转义,具体取决于它是否是内置的shell,是否兼容POSIX等。最好使用(IMHO)ls \$并看到我们得到“ ls:$:没有这样的文件或目录”,看到\ $不转义为$,而\\ $不转义为\ $,依此类推。
Henno 2010年

5

在将参数传递给程序之前,shell首先扩展所有转义序列,因此它将shell解释\$为转义序列,并将单个参数传递$grep,与行尾匹配。由于每一行都有结尾,所以任何一行都应该匹配:)


但是$如何结束?行尾不是\ n吗?

2
@Happy Mithal:请参阅man grep$无论行之间是否被,,或两者完全分开\n,都已决定匹配行的结尾\r。通常,正则表达式可用于匹配任何字符串,而不仅仅是“行”,并且$可用于匹配字符串的结尾。

2

它被解释为行尾元字符。如果要匹配实际的美元符号,请执行

 $ grep \\$ 

要么

 $ grep '\$' 

1

^用于字符串的开头和$结尾。

grep \$

要么

grep $

将匹配每个字符串,因此您键入的任何内容都会回显。

尝试

grep a$

现在,只有最后一个字符a被匹配的字符串才被匹配并回显


1

如果要搜索文字$,则可以使用字符类的正则表达式来避免转义的麻烦。例如,

$ grep '[$]' file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.