如果您对以下内容提出建议,我将不胜感激。
有一个名为“ABC”的文件夹,其中包含数千个 .xml 文件。 XML 的核心结构是相同的:
<product abcd…>
<category>
...
</category>
</product>
一些xml文件可以被认为是有效的因为它们包含必需的<category>
标签)其中一些是无效的因为所需的<category>
标签完全丢失。它甚至没有关闭</category>
因此,目标是通过终端找到那些</category>
放置在“ABC”文件夹中的 XML 中没有标签的“无效”xml。
任何机会?
答案1
假设所有 XML 文件都是格式正确的:使用xmlstarlet
,以下内容将打印符合以下条件的任何文件的输入文件名:不是在 下有一个category
节点作为直接子节点product
:
xmlstarlet sel -t --if '/product/category' --else -f -nl ABC/*.xml
如果您只想检测category
任何地方没有任何节点的文件:
xmlstarlet sel -t --if '//category' --else -f -nl ABC/*.xml
在这两个命令中,xmlstarlet
都会计算给定的 XPath 表达式。如果表达式的计算结果为一组至少一个找到的节点,则--if
测试为真的没有其他事情发生。否则,--else
将评估分支并-f -nl
导致输出当前文件名并带有尾随换行符。
假设您想对缺少节点的文件执行某些操作category
,以下设置一个循环,允许您处理相关文件:
for xml in ABC/*.xml; do
if ! xmlstarlet sel -t --if '/product/category' -nl "$xml" >/dev/null
then
# process "$xml" here
fi
done
在 macOS 上安装xmlstarlet
最好通过 Homebrew 完成。调用 Homebrew 包xmlstarlet
,并且将调用命令xml
而不是xmlstarlet
.
答案2
类似的东西可以完成这项工作:
grep -vl '</category>' ABC/*
如果您还想查看没有打开标签的文件,您可以尝试以下操作:
grep -vl 'category>' ABC/*