sed HTML <! - - >标签

时间:2016-07-26 09:37:45

标签: html bash sed

我想在解析HTML页面时从grep结果中删除所有HTML标记,这样结果就是纯文本, 例如,在解析phpinfo以仅获取PHP版本而不是包括HTML标记的整行时:

$curl -i http://piscina.tienda/phpinfo.php | grep 'PHP Version' | head -1 
 href="http://www.php.ne.... alt="PHP logo" /></a><h1 class="p">PHP Version 5.5.33</h1>

虽然我希望仅获得“PHP Version 5.5.33”。

我尝试过以下sed模式:

sed -e 's/<.*>//g'
sed -e 's/^<.*>$//g'

但结果是完整的HTML代码或全部空白(所有输出都被替换)。 你能告诉我在这种情况下是否可以用sed删除HTML标签,或者最好在这种情况下使用其他运算符?或问题是模式?

提前感谢任何提示!

4 个答案:

答案 0 :(得分:1)

通常,您不应使用sed等面向行的工具来操纵XML数据。使用像xmlstarlet这样的XML感知工具。在这种情况下,这可能会做你想要的:

xmllint --html --xpath '//text()'

答案 1 :(得分:0)

默认情况下,正则表达式是贪婪的,它们将搜索最大匹配。将?添加到*'s/<.*?>//g')以使匹配过程变得懒惰。

答案 2 :(得分:0)

感谢大家的提示。经过一些额外的研究,下面的模式就是这个伎俩:

sed -e&#39; s /&lt; [^&gt;] *&gt; // g&#39;

$ curl -is http://piscina.tienda/phpinfo.php | grep 'PHP Version' | head -1 | sed -e 's/<[^>]*>//g'
PHP Version 5.5.33

希望将来能帮到某人。

答案 3 :(得分:0)

您不需要sed,只需使用parameter expansion。这是代码:

#save the first line into a variable
line='href="http://www.php.ne.... alt="PHP logo" /></a><h1 class="p">PHP Version 5.5.33</h1>'
tempstr=${line%<*}
result=${tempstr##*>}
echo "$result"

输出:

PHP Version 5.5.33

如果你想将它们保存在脚本中,你可以通过以下方式保存字符串:

line=$(curl -i http://piscina.tienda/phpinfo.php | grep 'PHP Version' | head -1)

希望能帮到你。