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

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

我想搜索\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

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

在此输入图像描述

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

答案1

grep这与外壳所看到的内容和外壳所看到的内容有关。所以,两者都有。

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

printf '<%s>\n' G "G" 'G' \G "\G" '\G' \\G "\\G" '\\G'

这将展示什么与各种类型的引用有关。


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

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

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

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

答案2

在提到的例子中你提到过\G\\G

\\G==> 仅被视为 \G。反斜杠将使其视为普通字符串,而不是 Linux 中的特殊含义。因此,第一个反斜杠将使下一个字符串被视为普通字符串。所以第一个反斜杠不会被考虑

如果您想要\\G作为普通字符串,那么您需要提及为echo "\G\\\G

我用下面的例子进行了测试

通过提及以下内容创建了一个文件

猫测试.txt

\G
\\G

如果我只想 grep\G我将使用下面的命令

grep '^\\G' test.txt

输出

\G

如果我只想 grep"\\G"我将使用下面的命令

grep '\\\\G' test.txt

输出

\\G

我们可以通过 sed 命令来代替这个

使用以下命令查找包含 \G 的行

sed -n '/^\\G/p' test.txt

对于查找包含\\G以下命令的行

sed -n '/\\\\G/p' test.txt

相关内容