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 に答える