将正则向后查找字符串和首次出现另一个字符串之间的所有文本



我需要在'错误:'之前找到'get'(get zzzz)的最新出现:

GET xxxxx
GET yyyyy
GET zzzzz
Some text
more text
error: this is an error

可以做到吗?

编辑

谢谢,尴尬解决方案有效,但是可以通过最后一次出现"错误:?

来进一步改善这一点
GET xxxxx
GET yyyyy
GET zzzzz
Some text
more text
error: this is the first error
GET xxxxx
GET yyyyy
GET zzzzz
Some text
more text
error: this is the last error

尝试以下awk解决方案:

awk '
  /^GET/ { delete lines; c=0; inBlock=1 }
  /^error:/ { for(i=1; i<=c; ++i) print lines[i]; print; exit }
  inBlock { lines[++c] = $0 }
' file

这假设只能打印 1 块,并且还应打印error:行。(更新:有关仅打印 last 块的解决方案)。

  • /^GET/ { delete lines; c=0; inBlock=1 }在线路开始时遇到字符串GET时,在变量lines中开始构建一条线数。
  • /^error:/ { for(i=1; i<=c; ++i) print lines[i]; print; exit }在行的开头匹配字符串error:,并打印出到目前为止构建的所有行,然后是当前行,然后退出。
  • inBlock { lines[++c] = $0 }从最新的GET行添加到数组。

根据OP的请求:

更新

报告(仅)以 error:结尾的最后一个块,请使用以下内容:

awk '
  /^GET/ { delete lines; c=0; inBlock=1 }
  inBlock { lines[++c] = $0 }
  /^error:/ { inBlock=0; }
  END { for(i=1; i<=c; ++i) print lines[i] }
' file

这与第一个解决方案有所不同,因为后来的块简单地替换了早期的块,因此最后一个块" wins",然后在所有输入被处理后,在AWK脚本的END块中进行打印。

给定:

$ echo "$tgt"
first line
second line
GET xxxxx
GET yyyyy
GET zzzzz
Some text
more text
error: this is the first error
GET xxxxx
GET yyyyy
GET zzzzzLAST
Some text
more text
error: this is the last error
last line

您可以拥有一个多行的正则等级,它将丢弃所有字符,直到这样的最后一个所需的块如此:

/^.*^(GET.*^error[^n]*)/ms

演示

现在使用perl,读取整个文件并与之匹配。-0777命令行选项将导致整个文件读取:

$ echo "$tgt" | perl -0777 -ne 'print $1 if m/^.*^(GET.*^error[^n]*)/sm'
GET zzzzzLAST
Some text
more text
error: this is the last error

如果要在最后的"错误"行之外包含行,请将正则更改为:

/A.*^(GET.*^error.*)Z/ms

演示

在perl中:

$ echo "$tgt" | perl -0777 -ne 'print $1 if m/A.*^(GET.*^error.*)Z/ms'
GET zzzzzLAST
Some text
more text
error: this is the last error
last line

我设法获得了理想的结果,以下regexp:

(GET[^n]+n(?!GET).*)error:

您可以在http://regexpal.com/上进行测试。匹配所有模式。

相关内容

  • 没有找到相关文章

最新更新