2017-01-24 8 views
2

В основном необходимо удалить сторонние объекты (и все между ними) из набора отдельных XML-файлов с именем number.xml. Я попытался следующие, но это не совсем производить все, что нужно:Сценарий в Unix для удаления XML-тегов и содержимого из файла

cat test.xml | sed "s;<parties>;\do_opentag ;" | sed "s;</parties>;\do_closetag ;" | awk 'BEGIN { doPrint = 1; } /do_opentag/ { doPrint = 0; print $0; } /do_closetag/ { doPrint = 1; } { if (doPrint) print $0; }' | grep -v 'do_opentag\|do_closetag' 

<?xml version="1.0" encoding="UTF-8"?> 
<patent-document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" pid="58326519" doc-generation-date="2016-10-11"> 
    <bibliographic-data> 
    <application-reference> 
     <pan>46422</pan> 
    </application-reference> 
    <publication-reference> 
     <publication-office>KR</publication-office> 
     <patent-publication-date> 
     <year>2016</year> 
     <month>10</month> 
     <day>11</day> 
     </patent-publication-date> 
    </publication-reference> 
    <parties> 
     <applicants> 
     <applicant sequence="1"> 
      <name lang="EN"></name> 
      <address> 
      <location-of-work>KR</location-of-work>M 
      </address> 
     </applicant> 
     </applicants> 
    </parties> 
    </bibliographic-data> 
    <vendor>Any</vendor> 
    <document-translation-date>2016-11-24</document-translation-date>M 
    <invention-title lang="EN">Cell preservation container for liquid-based cell inspection</invention-title> 
    <abstract lang="EN">The present invention relates to a liquid for discharging liquid containing cells and cell may be a sampling which is simply eminent generated in </abstract> 
    <comment lang="EN"></comment> 
</patent-document> 

ответ

2

PARSING XML требует XML-анализатор. довольно прост в использовании. Чтобы удалить parties узел:

xmlstarlet ed -P -d '//parties' file.xml 

продуцирующие

<?xml version="1.0" encoding="UTF-8"?> 
<patent-document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" pid="58326519" doc-generation-date="2016-10-11"> 
    <bibliographic-data> 
    <application-reference> 
     <pan>46422</pan> 
    </application-reference> 
    <publication-reference> 
     <publication-office>KR</publication-office> 
     <patent-publication-date> 
     <year>2016</year> 
     <month>10</month> 
     <day>11</day> 
     </patent-publication-date> 
    </publication-reference> 

    </bibliographic-data> 
    <vendor>Any</vendor> 
    <document-translation-date>2016-11-24</document-translation-date>M 
    <invention-title lang="EN">Cell preservation container for liquid-based cell inspection</invention-title> 
    <abstract lang="EN">The present invention relates to a liquid for discharging liquid containing cells and cell may be a sampling which is simply eminent generated in </abstract> 
    <comment lang="EN"/> 
</patent-document> 
1

sed -e '/<parties>/,/<\/parties>/d' test.xml

В СЭД можно использовать два шаблона, разделенных запятой, чтобы применить патч в команду или команды в диапазоне строк, включая и между соответствующими шаблонами. Здесь я говорю d - удалите строку - от /<parties>/ до /<\/parties>/.

Это зависит от форматирования вашего XML. Не может быть другого содержимого в соответствующих строках, которые вам нужно сохранить.

Если вы хотите отредактировать файл на месте, добавьте флаг -i в sed.

+0

Спасибо. Почти готово. По какой-то причине я получаю сообщение о том, что «отсутствует новая строка в конце файла test.xml», и тег закрытия становится недоступным. Любой способ исправить это? – Cinda

+0

Поскольку последняя строка не содержит завершающего символа новой строки, sed никогда не обрабатывает ее. Я никогда не видел эту проблему, но [второй ответ здесь] (http://unix.stackexchange.com/questions/31947/how-to-add-a-newline-to-the-end-of-a- файл) представляется разумным: 'echo >> test.xml; sed -e '/ /,/<\/parties>/d' test.xml' – stevesliva