【问题标题】:sed HTML </ >tags [duplicate]sed HTML </ >标签[重复]
【发布时间】:2016-11-29 21:18:28
【问题描述】:

我想在解析 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 版本 5.5.33”作为结果。

我尝试了以下 sed 模式:

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

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

提前感谢任何提示!

【问题讨论】:

  • sed -e 's/&lt;\/?[^&gt;]*&gt;//g' ?
  • 问题出在模式上。在这种特殊情况下也很容易,但通常不应该使用正则表达式来解析 html。

标签: html bash sed


【解决方案1】:

您不需要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)

希望对你有帮助。

【讨论】:

  • 谢谢,虽然从未考虑过使用实际脚本,但希望它只是一个命令。不过,我认为它在未来可能会有用 =)
【解决方案2】:

一般来说,您不应使用sed 等面向行的工具来操作 XML 数据。请改用xmlstarlet 等支持 XML 的工具。在这种情况下,这可能会满足您的需求:

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

【讨论】:

  • 我认为 XML 感知工具对 HTML 没有帮助,因为 HTML 不太可能是有效的 XML。 (当我尝试使用 xml-sed 更改 HTML 文件时,我意识到了这一点。)我仍在寻找解决方案。
【解决方案3】:

谢谢大家的提示。经过一些额外的研究,以下模式成功了:

sed -e 's/]*>//g'

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

希望以后能对大家有所帮助。

【讨论】:

  • 将此答案标记为正确,以便人们更容易找到它。
  • 感谢您的提示,已标记。
【解决方案4】:

默认正则表达式是贪心的,他们会寻找最大的匹配。在* ('s/&lt;.*?&gt;//g') 中添加?,使匹配过程变得懒惰。

【讨论】:

  • sed 不支持非贪婪的正则表达式
猜你喜欢
  • 2017-03-06
  • 2021-12-11
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2018-06-27
  • 2012-11-07
  • 2014-11-16
相关资源
最近更新 更多