Как удалить теги XML из командной строки Unix? - PullRequest
17 голосов
/ 21 марта 2011

Я извлекаю XML-файл, который выводит меня следующим образом:

<tag>data</tag>
<tag>more data</tag>
...

Обратите внимание, что это плоский файл, а не дерево XML. Я хочу удалить теги XML и просто отображать данные между ними. Я делаю все это из командной строки, и мне было интересно, есть ли лучший способ, чем дважды передать его в awk ...

cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'

В идеале я хотел бы сделать это одной командой

Ответы [ 5 ]

35 голосов
/ 21 марта 2011

Если ваш файл выглядит так, тогда sed может вам помочь:

sed -e 's/<[^>]*>//g' file.xml

Конечно вам не следует использовать регулярные выражения для анализа XML , потому что этожесткий .

4 голосов
/ 21 марта 2011

Использование awk:

awk '{gsub(/<[^>]*>/,"")};1' file.xml
1 голос
/ 05 мая 2015

Используйте html2text инструмент командной строки, который преобразует HTML в простой текст.

В качестве альтернативы вы можете попробовать ex -way:

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt

или

cat file.txt | ex -s +'%s/<[^>].\{-}>//ge' +%p +q! /dev/stdin
1 голос
/ 22 марта 2011

Попробуйте:

grep -Po '<.*?>\K.*?(?=<.*?>)' inputfile

Пояснение:

Использование регулярных выражений, совместимых с Perl (-P) и вывод только указанных совпадений (-o):

  • <.*?> - Нежадное совпадение любых символов в угловых скобках
  • \K - Не включать предыдущее совпадение в выходные данные (сброс совпадения начала - аналогично положительному поиску, но он работает с совпадениями переменной длины)
  • .*? - остановка не жадного совпадения при следующем совпадении (эта часть будет выведена)
  • (?=<.*?>) - Нежадное сопоставление любых символов в угловых скобках и не включает совпадение в выходные данные (положительный прогноз - работает с сопоставлениями переменной длины)
0 голосов
/ 01 июня 2015

Я знаю, что это не "конкурс perlgolf", но я использовал этот трюк.

Установите разделитель записей для < или >, затем печатайте только нечетные строки:

awk -vRS='<|>' NR%2 file.xml
...