使用来自多个文件的awk提取数据

问题描述 投票:0回答:2

我有1000个这样的文件:

text1.txt

<span class="store-time">OPEN SINCE <em>Aug 9, 2010</em></span>

text2.txt

<span class="store-time">OPEN SINCE <em>Aug 9, 2012</em></span>

我想要从1000个文件中提取所有日期,每个日期都在新行中,如下所示:

Aug 9, 2010
Aug 9, 2012
...
search awk grep extract
2个回答
0
投票

如果您确定您的文件都具有此格式,则可以使用简单的sed表达式

sed -E -e 's/^<span class="store-time">OPEN SINCE <em>([A-Z][a-z]+ *[0-9]+, *[0-9]+)<\/em><\/span>/\1/' 

它只是找到你的行的开头,然后是一个看起来像日期的东西(字母后跟一个空格和一个数字,后跟一个逗号,再一个数字),以及你的行的结尾。 cat所有文件并将结果发送到sed输入,您将获得日期列表。

但正如评论中所指出的,解析xml文件可能会有问题(例如参见RegEx match open tags except XHTML self-contained tags)。如果xml标记分布在多行上,则脚本将无法提取信息,例如使用以下数据

<span class="store-time">
OPEN SINCE <em>Aug 9, 2012</em>
</span>

为了应对这种情况,还有更强大的工具。作为xmlstarletperl类工具的集合,如XML::libXML。它能够执行更加防崩溃的解析,但使用起来更复杂。

如果您确定所有文件都具有正确的格式,那么sed脚本可以解决您的问题。


0
投票

好吧,对于解析awksed等XML工具肯定不是第一选择,因为它们是基于行的,而XML则不是。

要在awk中完成工作,您可以使用以下内容:

awk '$0 ~ /<span class="store-time">.*/ {gsub(/^.*<em>/,"",$0) gsub(/<\/em>.*/,"",$0); print $0}' *.html

此命令获取所有html文件(* .html)并搜索以<span class="store-time">开头的行。然后它用一个空字符串替换从行的开头到第一个<em>的所有内容。它在</em>(包括</em>)之后的所有内容都是一样的

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.