如何通过空字符使grep单独输出?

Chi*_*nke 4 unix bash grep text-processing null-character

假设我们正在对一堆文件进行多行正则表达式模式搜索,并且我们想从 grep 中提取匹配项。默认情况下,grep 输出由换行符分隔的匹配项,但由于我们使用的是多行模式,这会造成我们无法轻松提取单个匹配项的不便。

例子

grep -rzPIho '}\n\n\w\w\b' | od -a
Run Code Online (Sandbox Code Playgroud)

根据文件树中的文件,这可能会产生类似的输出

0000000   }  nl  nl   m   y  nl   }  nl  nl   i   f  nl   }  nl  nl   m
0000020   y  nl   }  nl  nl   m   y  nl   }  nl  nl   i   f  nl   }  nl
0000040  nl   m   y  nl
0000044
Run Code Online (Sandbox Code Playgroud)

如您所见,我们无法拆分换行符以获得进一步处理的匹配项,因为匹配项本身包含换行符。

什么不起作用

现在--null(or -Z) 仅与 结合使用-l,这使得 grep 仅列出文件名而不是匹配项,因此这在这里无济于事。

请注意,这不是find 的 -print0 和 xargs 的 -0 开关是否有等价的 grep的副本,因为该问题的要求不同,因此可以使用替代技术来回答。

那么,我们怎样才能做到这一点呢?也许将 grep 与其他工具结合使用?

Chi*_*nke 5

所以我在 GNU grep 错误邮件列表中将此问题作为功能请求提交,它似乎是代码中的错误。

它已被修复并推送到 master,因此它将在下一版本的 GNU grep 中可用:http : //git.savannah.gnu.org/cgit/grep.git/commit/? id= cce2fd5520bba35cf9b264de2f1b6131304f19d2

总而言之:此补丁确保该-z标志不仅可以与 一起使用-l,还可以与一起使用-o