我正在使用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上。
答案 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
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
但在您的情况下,您只能依靠纯sed
或awk
解决方案......恕我直言。
但是,如果你有perl(并且只有没有HTML :: Strip模块),那么下一个仍然会更好sed
perl -0777 -pe 's/<.*?>//sg'
因为也将删除下一个(多行和常用)标记:
<a
href="#"
class="some"
>link text</a>
答案 2 :(得分:1)
答案 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