查找具有特定路径的 XML 文件

查找具有特定路径的 XML 文件

我正在处理 XML 文件,每个文件可能有几十行长。实际上有数百个这样的文件,分布在一个目录结构中。是的,它就是 Magento。

我需要找到包含该元素的文件<foo><bar><boom><bang>。一个<boom><bang>标签可以定义在其他标签下,所以我需要搜索完整路径不仅仅是结束标签或标签。每个标签之间可能有数十行,并且它们之间还有其他标签:

<foo>
  <hello_world>
... 50 lines ....
  </hello_world>
  <bar>
    <giraffe>
... 50 lines ....
    </giraffe>
    <boom>
      <bang>Vital information here</bang>
    </boom>
  </bar>
</foo>

搜索定义的文件的优雅的 *nix 方式是什么<foo><bar><boom><bang>我目前使用的是最新的 Debian 衍生发行版。

这是我目前的解决方案,远非雄辩:

$ grep -rA 100 foo * | grep -A 100 bar | grep -A 100 boom | grep bang | grep -E 'foo|bar|boom|bang'

答案1

您可以尝试xmlstarletect selfi路径存在然后输出f文件名:

find . -name '*.xml' -exec xmlstarlet sel -t -i '/foo/bar/boom/bang' -f -n {} +

答案2

使用xqXML 解析器工具yq安装包并仅当基于 xq 输出的退出状态为 0 时才打印文件名。

find -type f -name '*.xml' -exec sh -c '
    xq -e '.foo.bar.boom.bang' "$1" >/dev/null
' _ {} \; -print

-e 根据输出设置退出状态代码;


有关man jq此选项的更多详细信息,请参阅:

-e / --exit-status:
如果最后的输出值既不是 false 也不是 null,则将 jq 的退出状态设置为 0;如果最后的输出值是 false 或 null,则设置为 1;如果没有生成有效结果,则设置为 4。通常,如果存在任何使用问题或系统错误,则 jq 以 2 退出;如果存在 jq 程序编译错误,则以 3 退出;如果 jq 程序运行,则以 0 退出。

相关内容