0

我有数百个 xml 文件要处理 - 有些有特定的所需标签,有些没有。如果我只是将标签添加到所有文件,那么一些文件会得到 2 个标签(这并不奇怪!)。如何在没有笨拙的 grep 的情况下在 xmlstarlet 中选择要处理的文件?例如:

我在一些文件中有这个:...

<parent_tag>
    <another_tag/> <-- but not in all files
</parent_tag>

我想要这个(但有些文件已经有了):...

<parent_tag>
    <good_tag>foobar</good_tag>
    <another_tag/>
</parent_tag>

例如,这可行,但我希望我可以在没有 grep 的情况下完全在 xmlstarlet 中完成它:

grep -L good_tag */config.xml | while read i; do 
    xmlstarlet ed -P -S -s //parent_tag -t elem -n good_tag -v ""  $i > tmp || break
    \cp tmp $i
done

我让自己陷入了一些 XPATH 异国情调中,比如:

xmlstarlet sel --text --template --match //parent_tag --match "//parent_tag/node()[not(self::good_tag)]" -f --nl */config.xml

...但它没有做我所希望的...

4

1 回答 1

1

只需选择<parent_tag/>不包含<good_tag/>用于插入的元素:

xmlstarlet ed -P -S -s '//parent_tag[not(good_tag)]' -t elem -n good_tag -v ""

如果您还想测试标签的正确内容:

xmlstarlet ed -P -S -s '//parent_tag[not(good_tag[.="foobar"])]' -t elem -n good_tag -v ""
于 2013-08-30T08:23:43.647 回答