Как удалить теги XML из командной строки Unix?

Я копирую XML-файл, который дает мне вывод примерно так:

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

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

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

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

5 ответов

Решение

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

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

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

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

awk '{gsub(/<[^>]*>/,"")};1' file.xml

Попробуйте это:

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

Объяснение:

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

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

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

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

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

или же:

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

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

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

awk -vRS='<|>' NR%2 file.xml
Другие вопросы по тегам