Как удалить теги 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, потому что это сложно.
Попробуйте это:
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