UNIX grep with $

时间:2013-08-05 13:25:58

标签: regex grep

我有一个简单的问题:

假设我有一个文件包含:

abc$
$
$abc

然后我使用grep“c \ $”filename,然后我只获得了abc $。但如果我使用grep“c \\ $”,我就得到了abc $。

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

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

非常感谢提前。

4 个答案:

答案 0 :(得分:1)

如果您觉得$需要被转义,那就不是这样了。

GNU grep manual,您可以看出:

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

答案 1 :(得分:1)

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

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

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

请注意,作为行结束锚点的$具有一些情报。如果我将$放在正则表达式的中间,那么它就是常规字符:

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

在这里,它找到了文字字符串a$bc,无论我是否转义$

用双引号试试:

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

\转发$作为行尾锚点。将两个\\放在前面,将$转义为非shell元字符作为正则表达式文字。

答案 2 :(得分:0)

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

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

给出了这个输出:

abc$

PS: fgrepgrep -Fman grep

相同
  

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

答案 3 :(得分:0)

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

grep "c\$"

字符串扩展为两个字符c$grep认为它是regexp子句来自cnmon,找到末尾带有'c'的所有行< / em>的

如果是单引号,则所有字符都被视为每个字符,即

grep 'c\$'

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