4

我正在使用curl. 如果我的 curl 命令返回任何文本,我知道我有一个错误。这个返回的文本curl通常是 HTML。我想如果我可以去掉所有的 HTML 标签,我可以将结果文本显示为错误消息。

我在想这样的事情:

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

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

如果我替换*?*,我不会收到错误消息(也不会收到任何文本)。如果我删除全局( g) 标志,我会得到同样的错误。

这是在 Mac OS X 上。

4

4 回答 4

5

sed 不支持非贪婪。

尝试

's/<[^>]*>//g'
于 2013-07-24T21:25:45.233 回答
4

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

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

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

或者

您可以使用一个名为的标准 OS X 实用程序:textutil 请参阅手册页

textutil -convert txt file.html

file.txt使用剥离的 html 标签生成,或者

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>
于 2013-07-24T23:01:58.603 回答
1

GNU 的代码:

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

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

于 2013-07-24T22:00:49.980 回答
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
于 2019-02-16T11:46:41.510 回答