我有数百个要处理的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
......但它没有做我所希望的......
答案 0 :(得分:1)
只选择不包含<parent_tag/>
的{{1}}元素进行插入:
<good_tag/>
如果您还想测试标签的正确内容:
xmlstarlet ed -P -S -s '//parent_tag[not(good_tag)]' -t elem -n good_tag -v ""