如何在Shell脚本中使用正则表达式匹配多行模式

3

我希望编写一个bash脚本,在多行html文件中查找模式。

用于正则表达式的文件:

<td class="content">
  some content
</td>
<td class="time">
  13.05.2013  17:51
</td>
<td class="author">
  A Name
</td>

现在我想找到具有class="time"<td>标签的内容。
因此,原则上以下正则表达式: <td class="time">(\d{2}\.\d{2}\.\d{4}\s+\d{2}:\d{2})</td> 看起来似乎不能使用grep命令,因为...
  1. 它只返回完整行或使用-o返回括号中的结果(...)
  2. 它只在一行中查找模式。
那么如何才能得到一个只包含13.05.2013 17:51字符串的结果呢?

1
搜索了一下“命令行xml解析器”,发现了https://dev59.com/8HNA5IYBdhLWcg3wmfO5。 - Mike Makuch
3个回答

2

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


0

尝试:

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

或者

awk '/^td class="time">/{print $2}' ORS= RS=\< FS='>[[:space:]]*' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接