我在使用 grep 和管道时遇到问题。场景如下:我正在运行一个 python 脚本,它输出(使用打印)到屏幕调试消息。我./prog | grep "\[\[\[\["
用来捕捉带有“[[[[”的字符串。它返回的匹配结果很少,但不返回其他结果(另一个观察结果:grep 找到的结果在文件中 grep 未找到的结果之前)。我已经运行了./prog
无管道和 grep,它以“[[[[”模式输出所有字符串。
问问题
1287 次
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
。(您的“另一个观察”暗示了这一点。)您可以重定向stderr
到stdout
管道:
./prog 2>&1 | grep '\[\[\[\['
于 2012-04-25T21:10:06.863 回答