我想在解析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标签,或者最好在这种情况下使用其他运算符?或问题是模式?
提前感谢任何提示!
答案 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)
希望能帮到你。