从网页中删除所有HTML标记

时间:2013-07-24 21:23:27

标签: regex bash sed

我正在使用curl进行一些BASH shell脚本编写。如果我的curl命令返回任何文本,我知道我有一个错误。 curl返回的此文本通常是HTML格式。我想如果我可以删除所有HTML标记,我可以将结果文本显示为错误消息。

我在考虑这样的事情:

sed -E 's/<.*?>//g' <<<$output_text

但我得到sed: 1: "s/<.*?>//": RE error: repetition-operator operand invalid

如果我将*?替换为*,我就不会收到错误(我也没有收到任何文字)。如果我删除全局g)标志,我会收到同样的错误。

这是在Mac OS X上。

4 个答案:

答案 0 :(得分:5)

sed不支持非贪婪。

尝试

's/<[^>]*>//g'

答案 1 :(得分:3)

也许基于解析器的perl解决方案?

perl -0777 -MHTML::Strip -nlE 'say HTML::Strip->new->parse($_)' file.html

您必须使用cpan HTML::Strip命令安装HTML::Strip模块。

<强>替代地

您可以使用名为textutil see the man page

的标准OS X实用程序
textutil -convert txt file.html

将生成带有剥离的html标记的file.txt

textutil -convert txt -stdin -stdout < file.txt | some_command

另一种选择

某些系统安装了lynx纯文本浏览器。您可以使用:

lynx -dump file.html #or
lynx -stdin -dump < file.html

但在您的情况下,您只能依靠纯sedawk解决方案......恕我直言。

但是,如果你有perl(并且只有没有HTML :: Strip模块),那么下一个仍然会更好sed

perl -0777 -pe 's/<.*?>//sg'

因为也将删除下一个(多行和常用)标记:

<a
 href="#"
 class="some"
>link text</a>

答案 2 :(得分:1)

GNU代码

sed '/</ {:k s/<[^>]*>//g; /</ {N; bk}}' file

这可能会失败,您最好使用工具。

答案 3 :(得分:0)

如果要删除所有HTML标记以及所有脚本标记(及其内容),则可以使用以下内容:

sed 's/<script>.*<\/script>//g;/<script>/,/<\/script>/{/<script>/!{/<\/script>/!d}};s/<script>.*//g;s/.*<\/script>//g' $file -i && sed '/</ {:k s/<[^>]*>//g; /</ {N; bk}}' $file -i && sed -r '/^\s*$/d' $file -i