Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 2

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

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

Ответ 3

Попробуйте:

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

Пояснение:

Использование Perl Compatible Regular Expressions (-P) и вывод только указанных совпадений (-o):

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

Ответ 4

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

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

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

или

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

Ответ 5

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

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

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