我有一个简短的问题:
假设我有一个文件,其中包含:
abc$
$
$abc然后我使用grep "c\$“文件名,然后我只得到abc$。但是如果我使用grep "c\$",我会得到abc$。
我很困惑,反斜杠不是已经关闭了$的特殊含义吗?所以grep "c\$“filename返回行abc$?
真的希望谁能给我一些建议。
在此之前,非常感谢您。
发布于 2013-08-05 21:59:13
双引号把你弄糊涂了。这允许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$单个\作为行尾锚点对$进行了转义。将两个\\放在前面,将$作为非外壳元字符和正则表达式文字进行转义。
发布于 2013-08-05 21:32:09
如果您倾向于认为$需要转义,那么事实并非如此。
从GNU grep manual中,你会发现:
使用基本正则表达式时需要转义的元字符包括?、+、{、|、(和)。
发布于 2013-08-05 22:03:51
如果你想搜索文字$并避免转义$ (这意味着结束行),我建议使用fgrep:
fgrep 'abc$' <<< 'abc$'输出如下:
abc$PS: fgrep与grep -F相同,并且与man grep相同
-F,-- fixed -strings将模式解释为以换行符分隔的固定字符串的列表,其中任何一个都要匹配。
https://stackoverflow.com/questions/18059305
复制相似问题