如何在shell脚本中使用正则表达式来表示多行模式

时间:2013-09-15 02:04:56

标签: regex bash shell grep

我想写一个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似乎不是我可以使用的命令,因为......

  1. 它仅使用-o返回完整行或完整结果,而不仅仅是圆括号(...)内的结果。
  2. 模式只显示一行
  3. 那么我怎么可能只得到13.05.2013 17:51的字符串?

3 个答案:

答案 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