我想写一个bash脚本,在一个html文件中找到一个多行的模式。
正则表达式的文件:
<td class="content">
some content
</td>
<td class="time">
13.05.2013 17:51
</td>
<td class="author">
A Name
</td>
现在,我想找到<td>
- class="time"
标记的内容。
所以原则上是以下正则表达式:
<td class="time">(\d{2}\.\d{2}\.\d{4}\s+\d{2}:\d{2})</td>
grep
似乎不是我可以使用的命令,因为......
-o
返回完整行或完整结果,而不仅仅是圆括号(...)
内的结果。那么我怎么可能只得到13.05.2013 17:51
的字符串?
答案 0 :(得分:2)
它不完全存在,它出于某种原因打印出一条领先的换行符,但也许是这样的?
$ sed -n '/<td class="time">/,/<\/td>/{s/^<td class="time">$//;/^<\/td>$/d;p}' file
13.05.2013 17:51
受https://stackoverflow.com/a/13023643/1076493启发
编辑:嗯,总是perl!
有关详细信息,请参阅https://stackoverflow.com/a/1213996/1076493
$ perl -0777 -ne 'print "$1\n" while /<td class="time">\n (.*?)\n<\/td>/gs' regex.txt
13.05.2013 17:51
答案 1 :(得分:0)
您的格式有多固定?如果您确定它看起来像那样,那么您可以使用sed
来匹配第一行,获取下一行并打印它,如下所示:
$ sed -n '/<td *class="time">/{n;p}' test
13.05.2013 17:51
你可以添加一些内容来覆盖它在同一行上的情况。或者预先处理文件以去除所有换行符,也可能崩溃空格(显然不能用sed
完成)然后从那里开始。
但是,如果它是来自其他地方的HTML文件,你不能确定我考虑使用其他一些脚本语言来解析XML的格式,否则任何解决方案都会在格式化时破解变化。
编辑为这类事情添加指向我最喜欢的sed资源的链接:http://www-rohan.sdsu.edu/doc/sed.html
答案 2 :(得分:0)
尝试:
awk '/^td class="time">/{gsub(ORS,x); print $2}' RS=\< FS=\> file
或
awk '/^td class="time">/{print $2}' ORS= RS=\< FS='>[[:space:]]*' file