grep无法找到所有模式匹配“\ [\ [\ [\ [\ [”

时间:2012-04-25 21:03:15

标签: grep

我在使用grep和管道时遇到问题。方案如下: 我正在运行一个python脚本,它输出(使用print)到屏幕调试消息。我使用./prog | grep "\[\[\[\["来捕获字符串,其中包含“[[[[”)。它返回几个匹配的结果但不返回其他结果(另一个观察结果:grep找到的结果在文件中的grep找不到结果之前)。我运行./prog没有管道和grep,它输出所有字符串“[[[[”pattern。

2 个答案:

答案 0 :(得分: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 ~]$  

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

答案 1 :(得分:2)

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

./prog 2>&1 | grep '\[\[\[\['