查找包含其他文本和 xml 标签组合的文件内容,grep in grep?

查找包含其他文本和 xml 标签组合的文件内容,grep in grep?

我有很多与 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 分隔(使用-ZGNUgrep或兼容选项)。

grep -rlZ "needed_text" . |
  xargs -r0 pcregrep -Mo '(?s)<xmltag>.*?</xmltag>'

(假设没有嵌套<xmltag>s 并且<xmltag>s 不会出现在 CDATA 中,以及与使用正则表达式解析 XML 相关的常见警告)。

如果文件是正确的 XML 文件,您可以使用 XML 感知工具,如xmllintxpathxmlstarlet而不是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)。

相关内容