使用 grep 时如何搜索带有文字反斜杠的字符串?

Tim*_*Tim 7 grep bash

我想搜索\G包含反斜杠的字符串grep

$ echo "\G\\G" > /tmp/test
$ grep '\G' /tmp/test 
\G\G
$ grep '\\G' /tmp/test 
\G\G
$ grep "\\G" /tmp/test 
\G\G
$ grep "\G" /tmp/test 
\G\G
Run Code Online (Sandbox Code Playgroud)

另请参阅下面的屏幕截图以了解红色匹配项:

在此处输入图片说明

我想知道为什么只'\\G'有效?是仅仅因为 bash,还是因为 bash 和 grep?谢谢。

Wil*_*ard 11

这与grep所见与外壳所见有关。所以,两者。

如果您想查看grep各种形式的引用所看到的内容,请使用,例如:

printf '<%s>\n' G "G" 'G' \G "\G" '\G' \\G "\\G" '\\G'
Run Code Online (Sandbox Code Playgroud)

这将演示shell对各种类型的引用做了什么。


如果grep只看到 a G,它将仅搜索(并突出显示,使用您的设置)G匹配项。

如果grep看到单个反斜杠后跟 a G,它会(在您的实现和可能所有当前实现中)认为反斜杠从字符 中删除了任何特殊含义G。但是 to 没有任何特殊含义G,因此结果将与您刚刚通过的结果相同G

如果grep看到两个反斜杠,第一个会从第二个中删除特殊含义。因此,当grepsees 时\\G,它会搜索文字反斜杠后跟一个G. 那就是你想要的。

如果您使用-F标志 to grep, 来搜索固定字符串,则可以通过 just\G并获得相同的结果。(也就是说,如果您通过,\G以便grep 看到 \G,这将要求您以某种方式转义反斜杠,以便外壳不会将其删除。)