2015-05-16 5 views
3

Есть набор XML-документы в отдельных каталогах, каждый документ, как это:XMLStarlet удалить родительские элементы из нескольких документов рекурсивно

<xmldoc> 
     <data>data text</data> 
     <parent> 
     <descendent1> 
      <descendent2>motorcyclebaby.com?query</descendent2> 
     </descendent1> 
     </parent> 
    </xmldoc> 

Я хочу удалить родительский элемент, который содержит «мотоцикл» в descendent2 во всех документы. До сих пор у меня есть это, который работает для одного док:

xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml 

Я попытался это удалить родительский элемент рекурсивно с находкой:

find . -name 'xmldoc.xml' -print0 | xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml 

но получил «не удалось загрузить внешний объект "xmldoc.xml"»

также попытался:

find . -name "xmldoc.xml" -exec xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml {} + 
+0

Линия, которая работала в одном документе, возможно, не сработала. Если бы добавить --inplace: xmlstarlet ed --inplace -d "// parent [descendent1/descendent2 [contains (text(), 'motorcycle')]]" xmldoc.xml – motorbaby

ответ

2

Фигурные это!

find . -iname "xmldoc.xml" -exec xmlstarlet ed --inplace -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" {} + 

-iname игнорировать случай, так как мои документы были капитализированы

// родителя [descendent1/descendent2 [содержит ... необходимо, чтобы выбрать весь родительский элемент, где ребенок, содержащийся искомую строку.

- место, необходимое для внесения изменений в фактические документы, а не для печати в терминале.

{} + необходим с -exec, чтобы внести изменения в каждый документ, указанный в списке поиска.

\ o/

+0

Вам не нужно использовать 'xmldoc.xml 'в конце снова,' {} 'идет вместо него. В противном случае вы повторно редактируете документ в текущем каталоге еще раз для каждого другого файла (безвредный для этого конкретного редактирования, но не в целом). – npostavs

+0

Прямо на @npostavs. Это сработало. Благодаря! – motorbaby

+0

@shellter Вид не-проблемы, поскольку после удаления элемента команда ничего не может сделать. Но удалено за ваш совет. (для новых читателей: он сказал 'find. -iname" xmldoc.xml "-exec xmlstarlet ed --inplace -d" // parent [descendent1/descendent2 [содержит (текст(), 'motorcycle')]] "xmldoc. xml {} + ') – motorbaby