xmlstarlet递归地从多个文档中删除父元素
xmlstarlet delete parent elements from multiple documents recursively
在不同的目录中有一组 xml 文档,每个文档如下:
<xmldoc>
<data>data text</data>
<parent>
<descendent1>
<descendent2>motorcyclebaby.com?query</descendent2>
</descendent1>
</parent>
</xmldoc>
我想删除所有文档中 descendent2 中包含 "motorcycle" 的父元素。到目前为止,我有这个,适用于单个文档:
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
但得到了'failed to load external entity "xmldoc.xml"'
也尝试过:
find . -name "xmldoc.xml" -exec xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml {} +
想通了!
find . -iname "xmldoc.xml" -exec xmlstarlet ed --inplace -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" {} +
-iname 忽略大小写,因为我的文档是大写的
//parent[descendent1/descendent2[包含...需要 select 子元素包含搜索字符串的整个父元素。
--inplace 需要对实际文档进行更改,而不是在终端中打印。
{} + 需要与 -exec 一起对 find 列出的每个文档进行更改。
\o/
在不同的目录中有一组 xml 文档,每个文档如下:
<xmldoc>
<data>data text</data>
<parent>
<descendent1>
<descendent2>motorcyclebaby.com?query</descendent2>
</descendent1>
</parent>
</xmldoc>
我想删除所有文档中 descendent2 中包含 "motorcycle" 的父元素。到目前为止,我有这个,适用于单个文档:
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
但得到了'failed to load external entity "xmldoc.xml"'
也尝试过:
find . -name "xmldoc.xml" -exec xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml {} +
想通了!
find . -iname "xmldoc.xml" -exec xmlstarlet ed --inplace -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" {} +
-iname 忽略大小写,因为我的文档是大写的
//parent[descendent1/descendent2[包含...需要 select 子元素包含搜索字符串的整个父元素。
--inplace 需要对实际文档进行更改,而不是在终端中打印。
{} + 需要与 -exec 一起对 find 列出的每个文档进行更改。
\o/