У меня есть переменная 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 из переменной BASH?
Как уже упоминалось в комментарии, было бы лучше использовать синтаксический анализатор XML.
Если вы настаиваете на использовании регулярного выражения, вы можете использовать отрицательный класс символов в sed
:
sed 's/<[^>]*>//g' <<< "$word"
Как все заявили, не используйте регулярные выражения. Он рано или поздно сломается. Используйте язык, который предоставляет некоторую помощь в удалении 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.
Повторение (например, *
) по умолчанию является жадным в регулярных выражениях. Поэтому <.*>
Будет соответствовать всем, начиная с первого <
до последнего >
. В вашем случае это будет просто соответствовать всей строке и, следовательно, удалить все.
Вы должны использовать либо <[^>]*>
чтобы явно не соответствовать <
или использовать <.*?>
Чтобы включить нежелательную версию повторения.
Кстати: наличие HTML в переменной bash звучит очень странно. Возможно, есть намного более простой способ выполнить все, что вы хотите, без переменной bash.
в ПОЛЕЗНЫХ ОРИЕНТИРОВАННЫХ СЦЕНАРИИ ДЛЯ SED, для вашего запроса есть образцы.
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' <<< $word
xmlstarlet
, может быть?