我有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
...
如果您确定您的文件都具有此格式,则可以使用简单的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>
为了应对这种情况,还有更强大的工具。作为xmlstarlet
或perl
类工具的集合,如XML::libXML
。它能够执行更加防崩溃的解析,但使用起来更复杂。
如果您确定所有文件都具有正确的格式,那么sed脚本可以解决您的问题。
好吧,对于解析awk
或sed
等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>
)之后的所有内容都是一样的