通过 mac os 终端搜索没有特定标签的 .xml 文件

通过 mac os 终端搜索没有特定标签的 .xml 文件

如果您对以下内容提出建议,我将不胜感激。

有一个名为“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/*

相关内容