LINUX.ORG.RU

Как вырезать текст между двумя тэгами в xml?

 , , , ,


0

2

День добрый!

Ребят помогите пож. добиться удаления текста между тэгами <description>техт бла бла</description>: http://gross-trading.com/feed.xml

Попытался сам таким макаром, но без результата:

sed 's#\(<description>\).*\(</description>\)#\1'xxxxx'\2#g' test.xml > test2.xml
sed '/<description>/,/<\/description>/{//!d}' test.xml > test2.xml

Ответ на: комментарий от xaizek

Не пройдет для случая вида

<description><![CDATA[много самых разных букв]]></description>
Deleted
()
Ответ на: комментарий от xaizek

Спасибо, к сожалению не работает.

У меня есть предположение, что проблема лежит в многострочности текста между тэгами...

bikalexander
() автор топика

Обработка XML регулярками приводит к очень больным последствия иногда.

По сабжу, файл Ваш скачать непредставляется возможным, отсюда предполагаю, что все теги description могут оказаться в одной строке. Особенность sed - greedy matching, т.е. lazy-регулярки задать невозможно. Для нас это важно тем, что при нескольких </description> в строке итоговый matching будет до последнего соответствия. Т.е. удалится не содержимое в нескольких <description> а весь текст от первого <description> до последнего </description>.

Как это обойти в базовом случае верно указал xaizek - нужно определить некий «пограничный символ», которого точно не будет в удаляемом тексте. Но в XML может быть всё что угодно и такая регулярка будет работать до первого авось, к сожалению.

При наличии perl - надежнее решить на нём:

perl -pe 's|<(description)>.*?</\1>||'

P.S. Ссылка shell-script'а от этого актуальной быть не перестаёт.

Deleted
()
Последнее исправление: Rainor (всего исправлений: 1)

2016

Парсинг xml через регулярки.

Если хотите через консоль - есть xmlstarlet.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Deleted

У меня есть предположение, что проблема лежит в многострочности текста между тэгами...

Тогда нужна небольшая правка

perl -pe 'BEGIN{undef $/;} s|<(description)>.*?</\1>||smg'
Deleted
()
Ответ на: комментарий от Deleted

Спасибо за отклик.

Я думаю что Вы правы, с этим файлом и регулярными выражениями одни чудеса...с Вашими примерами попробывал, но всеравно удаляется лишнее.

Файл еще раз перезалил: gross-trading.com/file.gz

Я бы с удовольствием использовал xmlstarlet но утилиты валетают из за большого размера файла.

Может есть у кого подходящий скрипт на perl или php, который сможет удалить содержимое тэга прямо внутри файла без предварительной загрузки в память?

Единственное что я нашел, так это библиотека XML::Twig вроде справляется с данной задачей...

Спасибо

bikalexander
() автор топика
Ответ на: комментарий от bikalexander

Забавно что description - не самая жирная нода в файле.

Можно посмотреть в сторону awk. С большими файлами он работает очень неплохо (но у меня с ним опыта мало, к сожалениб). Проблема - из-за кривого форматирования файла придётся sed'ом один раз прогоняться:

sed 's/>/>\n/g;s/</\n</g'  | awk '/<description>/{hide=1} /<sales_notes/{hide=0} {if (hide==0) print;}' 
Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.