我有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
...
答案 0 :(得分: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>
要处理这种情况,有更强大的工具。作为工具xmlstarlet
或perl
类的集合,例如XML::libXML
。它们能够执行更防崩溃的解析,但是使用起来更复杂。
如果您完全确定所有文件都具有正确的格式,那么sed脚本可以解决您的问题。
答案 1 :(得分:0)
对于解析诸如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>
),它都执行相同的操作