3

我想编写一个 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. 它只在一行中查找模式

那么我怎么可能只得到一个字符串13.05.2013 17:51呢?

4

3 回答 3

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
于 2013-09-15T02:26:13.270 回答
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

于 2013-09-15T02:49:51.273 回答
0

尝试:

awk '/^td class="time">/{gsub(ORS,x); print $2}' RS=\< FS=\> file

或者

awk '/^td class="time">/{print $2}' ORS= RS=\< FS='>[[:space:]]*' file
于 2013-09-15T09:40:33.063 回答