処理する 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
...しかし、それは私が望んでいたことをしていません...