2013-08-30 24 views
0

我有數百個xml文件要處理 - 有些需要特定的標籤,有些則不需要。如果我只是將標籤添加到所有文件,那麼一些文件會得到2個標籤(沒有意外!)。我如何在沒有笨拙的grep的xmlstarlet中選擇要使用的文件?例如: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 

我得到了myse LF在一些XPATH異國情調喜歡糾結了:

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

...但它沒有做什麼,我原本希望......

回答

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 "" 
相關問題