3

我在使用 grep 和管道时遇到问题。场景如下:我正在运行一个 python 脚本,它输出(使用打印)到屏幕调试消息。我./prog | grep "\[\[\[\["用来捕捉带有“[[[[”的字符串。它返回的匹配结果很少,但不返回其他结果(另一个观察结果:grep 找到的结果在文件中 grep 未找到的结果之前)。我已经运行了./prog无管道和 grep,它以“[[[[”模式输出所有字符串。

4

2 回答 2

3

问题是左方括号是正则表达式中的特殊字符。“grep”不仅仅是一个字符串匹配器。正则表达式是一种涉及语言,可让您描述文本模式。Grep 试图解释[[[[为一个正则表达式,而不仅仅是一个字符串。

正如您的问题主题所暗示的,您通常可以使用反斜杠转义特殊字符。所以以下可能有效:

./prog | grep '\[\[\[\['

您还可以通过将方括号放在方括号内来“转义”方括号。因此,[[][[][[][[]或者[[]{4}如果您的 grep 版本可以处理它。

您还需要确定您的程序./prog是发送输出到“标准输出”还是“标准错误”。您可以使用以下命令将所有 stderr 通过管道:

./proc 2>&1 | egrep '[[]{4}'

更新:

[ghoti@pc ~]$ printf '[[[[\n[[[\n[[[[\n[[[[[\n[[\n' | grep '\[\[\[\['
[[[[
[[[[
[[[[[
[ghoti@pc ~]$ printf '[[[[\n[[[\n[[[[\n[[[[[\n[[\n' | egrep '[[]{4}'
[[[[
[[[[
[[[[[
[ghoti@pc ~]$  

显然,我的结果与您的结果不符。如果您可以提供有关您正在处理的数据的更多详细信息,这将有助于尝试复制您的结果。

于 2012-04-25T21:11:53.407 回答
2

错误消息通常发送到stderr,而不是stdout;您的管道正在过滤stdout。(您的“另一个观察”暗示了这一点。)您可以重定向stderrstdout管道:

./prog 2>&1 | grep '\[\[\[\['
于 2012-04-25T21:10:06.863 回答