Как удалить все теги HTML, появляющиеся в переменной в BASH?

0

У меня есть переменная BASH, содержащая некоторые теги HTML, например:

word="<b><div class="light">apple</div></b><i>This is some text.</i>"

Мне нужно удалить весь HTML, по сути, все между каждой парой < и >, оставив только контент, например, результат будет:

appleThis is some text.

Я попробовал множество возможных решений:

word="$(sed 's#<.*>##g' <<< $word)"
word="$(awk '/<html>/{f=1;next} !f; /<\/html>/{f=0}' <<< $word)"

Как ни странно, это, кажется, удаляет весь текст.

  • Заметьте, возможно, что иногда тег HTML не имеет закрывающего тега, но все теги должны быть удалены независимо от того, найдена ли пара.

Как я могу удалить все теги HTML из переменной BASH?

  • 0
    Используйте синтаксический анализатор XML. xmlstarlet , может быть?
Теги:
variables
awk
sed

4 ответа

1
Лучший ответ

Как уже упоминалось в комментарии, было бы лучше использовать синтаксический анализатор XML.

Если вы настаиваете на использовании регулярного выражения, вы можете использовать отрицательный класс символов в sed:

sed 's/<[^>]*>//g' <<< "$word"
2

Как все заявили, не используйте регулярные выражения. Он рано или поздно сломается. Используйте язык, который предоставляет некоторую помощь в удалении HTML. Например, Perl имеет модуль CPAN, называемый HTML :: Strip. Используя это, вы можете:

$ word="<b><div class="light">apple</div></b><i>This is some text.</i>"
$ perl -MHTML::Strip -lpe '{$hs = HTML::Strip->new(); $_ = $hs->parse($_)}' <<< "$word"
apple This is some text.
1

Повторение (например, *) по умолчанию является жадным в регулярных выражениях. Поэтому <.*> Будет соответствовать всем, начиная с первого < до последнего >. В вашем случае это будет просто соответствовать всей строке и, следовательно, удалить все.

Вы должны использовать либо <[^>]*> чтобы явно не соответствовать < или использовать <.*?> Чтобы включить нежелательную версию повторения.

Кстати: наличие HTML в переменной bash звучит очень странно. Возможно, есть намного более простой способ выполнить все, что вы хотите, без переменной bash.

1

в ПОЛЕЗНЫХ ОРИЕНТИРОВАННЫХ СЦЕНАРИИ ДЛЯ SED, для вашего запроса есть образцы.

sed -e :a -e 's/<[^>]*>//g;/</N;//ba' <<< $word

Ещё вопросы

Сообщество Overcoder
Наверх
Меню