0

我有一个快速的问题:

假设我有一个文件包含:

abc$
$
$abc

然后我使用 grep "c\$" 文件名,然后我只得到 abc$。但如果我使用 grep "c\\$",我得到 abc$。

我很困惑,反斜杠不是已经关闭了$的特殊含义吗?所以 grep "c\$" filename 返回 abc$?

真心希望谁能给我一些建议。

提前谢谢了。

4

4 回答 4

2

双引号让你失望。这允许外壳扩展元字符。在我的 Linux 机器上仅使用单引号:

$ grep 'abc$' <<<'abc$'
$ grep 'abc\$' <<<'abc$'
$ grep 'abc\$' <<<"abc$"
abc$
$ grep 'abc$' <<<'abc$'
$ grep 'abc\\$' <<<'abc$'
$ 

请注意,grep在上面的五个命令中,唯一找到该模式(并将其打印出来)的是abc\$. 如果我没有逃脱$,它假定我正在寻找abc锚定到行尾的字符串。当我在 之前放置一个反斜杠时$,它将 识别$为文字字符而不是行尾锚。

请注意,$作为 end of line 锚点具有一定的智能性。如果我把它放在$正则表达式的中间,它就是一个正则字符:

$ grep 'a$bc' <<<'a$bc'
a$bc
$ grep 'a\$bc' <<<'a$bc'
a$bc

在这里,a$bc无论我是否逃脱了$.

用双引号尝试过的东西:

$ grep "abc\$" <<<'abc$'
$ grep "abc\\$" <<<'abc$'
abc$

\人逃脱了$作为线锚的末端。将两个\\放在前面将转义$为非 shell 元字符正则表达式文字。

于 2013-08-05T13:59:12.530 回答
1

如果您倾向于认为$需要逃避,那么事实并非如此。

GNU grep manual中,您会发现:

使用基本正则表达式时需要转义的元字符是?, +, {, |, (, 和).

于 2013-08-05T13:32:08.953 回答
0

符号在正则表达式模式中作为行尾$具有特殊含义,因此当您使用双引号时

grep "c\$"

字符串扩展为两个字符c$grep认为它是正则表达式子句c'mon,找到所有以 'c' 结尾的行

在单引号的情况下,所有字符都被视为每个字符,即

grep 'c\$'

命令将包含三个字符c和。因此将在其输入处获得所有这些符号,因此他会转义特殊符号,即按照您的预期进行操作。\$grep$\$

于 2013-08-05T14:13:16.807 回答
0

fgrep如果您想搜索文字$并避免转义$(这意味着行尾),我建议您使用:

fgrep 'abc$' <<< 'abc$'

给出这个输出:

abc$

PSfgrepgrep -Fman grep

-F, --fixed-strings 将 PATTERN 解释为固定字符串的列表,由换行符分隔,其中任何一个都将被匹配。

于 2013-08-05T14:03:51.070 回答