我想使用 sed 从 html 标签中提取值

我想使用 sed 从 html 标签中提取值

我想使用 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

您可以用作html2sed 的“预处理器”:

$ 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

相关内容