在不同的目录中有一组xml文档,每个文档都是这样的:
<xmldoc>
<data>data text</data>
<parent>
<descendent1>
<descendent2>motorcyclebaby.com?query</descendent2>
</descendent1>
</parent>
</xmldoc>
我想删除包含&#34; motorcycle&#34;的父元素。在descendent2中的所有文件。到目前为止,我有这个,适用于单个文档:
xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml
我试过用find:
递归删除父元素 find . -name 'xmldoc.xml' -print0 | xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml
但未能加载外部实体&#34; xmldoc.xml&#34;&#39;
也尝试过:
find . -name "xmldoc.xml" -exec xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml {} +
答案 0 :(得分:2)
想出来了!
find . -iname "xmldoc.xml" -exec xmlstarlet ed --inplace -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" {} +
- 由于我的文档已大写,因此忽略了大小写
// parent [descendent1 / descendent2 [contains ...]需要选择子项包含搜索字符串的整个父元素。
- inplace需要更改实际文档,而不是在终端中打印。
使用-exec{} +需要对find列出的每个文档进行更改。
\ O /