我有很多与 grep 'xmltag' 和 'subtag' 匹配的文件。
random xml
needed_text
random xml
<xmltag>
<subtag>content</subtag>
</xmltag>
我想搜索与另一个文本“needed_text”匹配的文件。
输出至少应包含“内容”,但完整的行也可以接受:
<xmltag>
<subtag>content</subtag>
</xmltag>
xmltag 和 subtag 可能位于同一行或不同行
grep -rl "needed_text" *
给出了我需要作为第二部分输入的文件名列表,但是我如何将其提供给另一个 grep (或其他命令)以及如何确保它只找到 xmltag 和 subtag 的组合
答案1
要将文件列表传递给另一个命令,您可以使用xargs
.为了使其可靠,您需要-0
大多数现代实现支持的选项,并且文件路径列表必须以 NUL 分隔(使用-Z
GNUgrep
或兼容选项)。
grep -rlZ "needed_text" . |
xargs -r0 pcregrep -Mo '(?s)<xmltag>.*?</xmltag>'
(假设没有嵌套<xmltag>
s 并且<xmltag>
s 不会出现在 CDATA 中,以及与使用正则表达式解析 XML 相关的常见警告)。
如果文件是正确的 XML 文件,您可以使用 XML 感知工具,如xmllint
、xpath
、xmlstarlet
而不是pcregrep
提取所需的标签。
grep -rlZ "needed_text" . |
xargs -r0 xpath -e //xmltag
或者仅适用于xmltag
至少有一个 的 s subtag
:
grep -rlZ "needed_text" . |
xargs -r0 xpath -e //xmltag/subtag/..
(这里使用perl 模块xpath
附带的XML::XPath
)。