匹配模式中线并在awk

时间:2016-02-26 00:35:15

标签: regex awk

一直在尝试使用awk及其gensub()来匹配不在行开头的模式,并在第一部分和匹配之间插入换行符。

模式是匹配MM / DD HH:MM:SS。

我的脚本splitatdate.awk

#!/usr/bin/awk -f
{
  if ( /.+[0-9][0-9][/][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] / ) {
    print gensub(/^\(.+\)\([0-9][0-9][/][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] \)/,"\\1\n\\2", "g")
  }
}

我的测试输入break-me.txt,其中包含我所拥有的线型的示例:

11/25 08:06:30 good text follows here
rs = ['yada yada11/25 08:07:41 more interesting stuff
rs = ['things with data: tag value
rs = ['yada yada data: 11/25 08:07:43 even more interesting stuff

我在bash中运行时得到的结果:splitatdate.awk break-me.txt是:

rs = ['yada yada11/25 08:07:41 more interesting stuff
rs = ['yada yada data: 11/25 08:07:41 even more interesting stuff

匹配正确的行(那些不是以日期内容开头的行)但是没有插入新行,或者据我所知,做任何替换。

我以为我会得到:

rs = ['yada yada
11/25 08:07:41 more interesting stuff
rs = ['yada yada data: 
11/25 08:07:41 even more interesting stuff

完整的任务是按原样回显每一行,但用换行符拆分那些日期字符串不在开头的行。但我需要理解为什么这部分不起作用。如果有人拥有更好的工具,但我想知道自己做错了什么,我就不会停止使用awk。

这是在RHEL 6上使用GNU awk 3.1.7。

编辑:这个脚本的答案:在gensub()中捕获分组parens之前不要使用反斜杠。

2 个答案:

答案 0 :(得分:0)

使用GNU sed:

$ sed -r 's|^(.+)([0-9]{2}/[0-9]{2} ([0-9]{2}:){2}[0-9]{2}.*)$|\1\n\2|' infile
11/25 08:06:30 good text follows here
rs = ['yada yada
11/25 08:07:41 more interesting stuff
rs = ['things with data: tag value
rs = ['yada yada data: 
11/25 08:07:43 even more interesting stuff

它捕获第一个捕获组中日期字符串之前的内容以及第二个捕获组中日期字符串开头的所有内容,然后插入换行符。

为了保证一行不以日期字符串开头,我们要求.+前面至少有一个字符("其中一个或多个")。

答案 1 :(得分:0)

在捕获组parens之前摆脱反斜杠 - 只使用(..),而不是\(..\),因为后者是文字的parens。

您可能希望使用它,但不必指定regexp两次:

$ awk 'match($0,/(.+)([0-9][0-9][/][0-9][0-9] [0-9][0-9](:[0-9][0-9]){2}.*)/,a) { print a[1] "\n" a[2]  }' file
rs = ['yada yada
11/25 08:07:41 more interesting stuff
rs = ['yada yada data:
11/25 08:07:43 even more interesting stuff

它的GNU awk为第3个arg匹配(),但你还是使用了gawk。