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 与其他工具结合使用?
所以我在 GNU grep 错误邮件列表中将此问题作为功能请求提交,它似乎是代码中的错误。
它已被修复并推送到 master,因此它将在下一版本的 GNU grep 中可用:http : //git.savannah.gnu.org/cgit/grep.git/commit/? id= cce2fd5520bba35cf9b264de2f1b6131304f19d2
总而言之:此补丁确保该-z
标志不仅可以与 一起使用-l
,还可以与一起使用-o
。