我有一个快速的问题:
假设我有一个文件包含:
abc$
$
$abc
然后我使用 grep "c\$" 文件名,然后我只得到 abc$。但如果我使用 grep "c\\$",我得到 abc$。
我很困惑,反斜杠不是已经关闭了$的特殊含义吗?所以 grep "c\$" filename 返回 abc$?
真心希望谁能给我一些建议。
提前谢谢了。
双引号让你失望。这允许外壳扩展元字符。在我的 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 元字符和正则表达式文字。
符号在正则表达式模式中作为行尾$
具有特殊含义,因此当您使用双引号时
grep "c\$"
字符串扩展为两个字符c
,$
并grep
认为它是正则表达式子句c'mon,找到所有以 'c' 结尾的行。
在单引号的情况下,所有字符都被视为每个字符,即
grep 'c\$'
命令将包含三个字符c
和。因此将在其输入处获得所有这些符号,因此他会转义特殊符号,即按照您的预期进行操作。\
$
grep
$
\$
fgrep
如果您想搜索文字$
并避免转义$
(这意味着行尾),我建议您使用:
fgrep 'abc$' <<< 'abc$'
给出这个输出:
abc$
PS :fgrep
与grep -F
man grep
-F, --fixed-strings 将 PATTERN 解释为固定字符串的列表,由换行符分隔,其中任何一个都将被匹配。