我正在处理 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
您可以尝试xmlstarlet
ect sel
fi
路径存在然后输出f
文件名:
find . -name '*.xml' -exec xmlstarlet sel -t -i '/foo/bar/boom/bang' -f -n {} +
答案2
使用xq
XML 解析器工具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 退出。