Ответ 1
Если ваш файл выглядит так, то sed
может вам помочь:
sed -e 's/<[^>]*>//g' file.xml
Конечно, вам не следует использовать регулярные выражения для синтаксического анализа XML потому что это трудно.
Я приветствую XML файл, который дает мне вывод следующим образом:
<tag>data</tag>
<tag>more data</tag>
...
Примечание. Это плоский файл, а не дерево XML. Я хочу удалить теги XML и просто отображать данные между ними. Я делаю все это из командной строки и задаюсь вопросом, есть ли лучший способ, чем дважды проложить его в awk...
cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'
В идеале я хотел бы сделать это в одной команде
Если ваш файл выглядит так, то sed
может вам помочь:
sed -e 's/<[^>]*>//g' file.xml
Конечно, вам не следует использовать регулярные выражения для синтаксического анализа XML потому что это трудно.
Использование awk:
awk '{gsub(/<[^>]*>/,"")};1' file.xml
Попробуйте:
grep -Po '<.*?>\K.*?(?=<.*?>)' inputfile
Пояснение:
Использование Perl Compatible Regular Expressions (-P
) и вывод только указанных совпадений (-o
):
<.*?>
- Нежелательное соответствие любых символов в угловых скобках\K
- Не включайте предыдущее совпадение на выходе (reset начало матча - похоже на положительный внешний вид, но оно работает с совпадением переменной длины).*?
- Нежелательное совпадение в следующем матче (эта часть будет выводиться)(?=<.*?>)
- Нежелательное соответствие любых символов в угловых скобках и не включает совпадение на выходе (положительный прогноз вперед - работает с совпадением переменной длины)Используйте инструмент командной строки html2text
, который преобразует html в обычный текст.
В качестве альтернативы вы можете попробовать ex -way:
ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt
или
cat file.txt | ex -s +'%s/<[^>].\{-}>//ge' +%p +q! /dev/stdin
Я знаю, что это не "конкурс перлгольфа", но я использовал этот трюк.
Установите разделитель записи для <
или >
, затем напечатайте только нечетные строки:
awk -vRS='<|>' NR%2 file.xml