it-swarm.com.ru

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

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

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

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

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

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

17
Tarski

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

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

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

34
Johnsyweb

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

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

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

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

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

или же:

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

Дайте это попробовать:

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

Объяснение:

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

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

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

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

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