我想使用 sed 从 html 标签中提取值
文件:
<td class=xl7128074></td>
<td class=xl7128074></td>
<td class=xl7128074></td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl8428074 style='height:15.75pt;border-top:none'>ANT</td>
<td class=xl10028074 style='border-top:none;border-left:none'>$interoprfbcheck_prodconnectorstatus_ANT</td>
<td class=xl8228074>ANT</td>
<!-- This is set by Python -->
<td class=xl155577 style='border-left:none;font-size:11.0pt;color:#006100;
font-weight:400;text-decoration:none;text-underline-style:none;text-line-through:
none;font-family:Arial;border-top:none;border-right:1.0pt solid windowtext;
border-bottom:1.0pt solid windowtext;border-left:1.0pt solid windowtext;
background:#E6EFCE;mso-pattern:black none'>
GREEN</td>
<td class=xl7128074></td>
<td class=xl7128074></td>
<td class=xl7128074></td>
我想要预期的结果:
ANT
$interoprfbcheck_prodconnectorstatus_ANT
ANT
GREEN
我正在使用sed -n 's/<td.*>\(.*\)<\/td>/\1/p' filename.html
并得到以下结果:
ANT
$interoprfbcheck_prodconnectorstatus_ANT
ANT
GEEEN 没有来,我想因为它不在同一行,我们是否可以添加任何东西来获得下一行的结果?
答案1
您可以用作html2
sed 的“预处理器”:
$ html2 <file 2>/dev/null | sed '/td=/!d;s/^.*td=//'
ANT
$interoprfbcheck_prodconnectorstatus_ANT
ANT
GREEN
答案2
GREEN
不会出现,因为生成器将其放置在单独的行上,因此您的sed
脚本找不到匹配项。无需特殊安排,sed
即可将传入流逐行拉入匹配空间。
因此,您需要使用N
命令将新行拉入匹配空间,直到在那里关闭</tr>
,然后将模式空间的副本存储在保留空间中,删除前导<tr ...>
标签并删除从</tr>
匹配空间开始到末尾的所有内容并打印它。
此后,您需要将匹配空间替换为保留空间的内容,删除已打印的部分并重新开始寻找前导<tr ...>
标签。
info sed
详情请参阅
答案3
由于多种原因,您发布的 HTML 示例不是有效的 XML。但是,如果问题已解决,您可以使用以下命令:
xmlstarlet sel -t -v '//td[text()]' input.html
结果并不完全符合您的预期,因为最后一个非空的文本td
不是GREEN
, 而是\nGREEN
。