我有一个简单的问题:
假设我有一个文件包含:
abc$
$
$abc
然后我使用grep“c \ $”filename,然后我只获得了abc $。但如果我使用grep“c \\ $”,我就得到了abc $。
我很困惑,不反斜杠已经关闭$的特殊含义?所以grep“c \ $”filename返回行abc $?
真的希望谁能给我一些建议。
非常感谢提前。
答案 0 :(得分:1)
答案 1 :(得分:1)
双引号会让你失望。这允许shell扩展元字符。在我的Linux机器上仅使用单引号:
$ grep 'abc$' <<<'abc$'
$ grep 'abc\$' <<<'abc$'
$ grep 'abc\$' <<<"abc$"
abc$
$ grep 'abc$' <<<'abc$'
$ grep 'abc\\$' <<<'abc$'
$
请注意,上面发现模式(并打印出来)的五个命令中只有grep
为abc\$
。如果我没有逃脱$
,它假设我正在寻找锚定到该行末尾的字符串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: fgrep
与grep -F
和man grep
-F, - 固定字符串 将PATTERN解释为固定字符串列表,由换行符分隔,其中任何一个都要匹配。
答案 3 :(得分:0)
签名$
在正则表达式模式中具有特殊含义行尾,因此当您使用双引号时
grep "c\$"
字符串扩展为两个字符c
和$
和grep
认为它是regexp子句来自cnmon,找到末尾带有'c'的所有行< / em>的
如果是单引号,则所有字符都被视为每个字符,即
grep 'c\$'
命令将包含三个字符c
,\
和$
。因此grep
将在其输入处获得所有这些符号,因此他会转义特殊$
符号,即\$
并执行您所期望的。