[英]i got line from html file using grep in unix script, but i can't figure out how to extract text using sed
[英]How can I extract data from HTML table cells using sed, awk, or grep?
我有一个cURL Bash脚本,它可以访问网站并发布数据,然后将其返回给文本文件。 文本文件全部以HTML格式返回,我无法弄清楚如何从中提取所需的信息。 这是Info.txt中的HTML:
<table cellspacing="1" cellpadding="0" border="0">
<tr><td><img src="/themes/img/status/green.gif" width="12" height="12" border="0"/></td><td><font class="small"><i>October 15, 2013 @ 1:34pm (PST)</i></font></td></tr>
<tr><td><font class="small">MF: </font></td><td><font class="small">PSVBHP9001230079779201</font></td></tr>
<tr><td><font class="small">SN: </font></td><td><font class="small">1354716309166</font></td></tr>
<tr><td><font class="small">ID: </font></td><td><font class="small">800.10</font></td></tr>
</table>
我需要提取这3个值:
我用grep尝试了这个,但没有取得多大成功。 我似乎无法弄清楚如何提取我想要的值。 我已经尝试了多个sed和awk命令,但最接近的是我可以使用这个grep命令:
$ grep -o '[^ ]*.PSV[^ ]*' Info.txt
<tr><td><font>PSVBHP9001230079779201</font></td></tr>
有时,如果符合以下条件,您可以轻松使用HTML:
您的语料库似乎不符合这些条件,因此请使用HTML或XML解析器来获得最佳结果。
Ruby的Nokogiri gem和XPath选择器可以快速完成这项工作。 例如:
require 'nokogiri'
doc = Nokogiri::HTML(File.read '/tmp/info.txt');
doc.xpath('//td[2]').map(&:content).reject { |e| e.include? ':' }
#=> ["PSVBHP9001230079779201", "1354716309166", "800.10"]
这将从每行中选择第二个单元格,并使用冒号放弃任何结果。 如果您不确定所需的字段是否始终位于第二个单元格中,那么您的语料库也将与此替代正确匹配:
doc.xpath('//td').map(&:content).reject { |e| e.empty? or e.include? ':' }
#=> ["PSVBHP9001230079779201", "1354716309166", "800.10"]
您当然可以调整选择器以匹配对语料库的任何更改,或将结果存储在变量中,以便在解析器返回候选字段后优化结果。 天空是极限,但这应该足以让你开始。
$ awk -F'[<>]' '/<tr><td><font/{print $15}' file
PSVBHP9001230079779201
1354716309166
800.10
虽然解析HTML是规范正确的解决方案,但您肯定还有其他选择。 其中一个选项是将HTML转换为平面格式,可以使用您选择的工具进行过滤或拆分。 PYX表示法和xml2工具使用的直观但未记录的格式是以线性格式表示HTML文档的两种方法。 对于这个用例,我推荐后者。
鉴于您发布的语料库,以下内容将适用于xml2包中的html2实用程序:
$ html2 < /tmp/info.txt | fgrep /td/ | egrep -v '[:@]' | cut -d= -f2
PSVBHP9001230079779201
1354716309166
800.10
这适用于:
展平HTML显然有点像黑客,配方可能需要额外的过滤以适应您的真实语料库。 另一方面,它在命令行中运行良好,不需要深入了解文档类型定义 , 文档对象模型或XPath 。 它还利用您对sed,grep,awk,cut等核心实用程序的了解。
你的旅费可能会改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.