加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式向后查找字符串和第一次出现的另一个字符串之间的所有

发布时间:2020-12-14 05:49:07 所属栏目:百科 来源:网络整理
导读:我需要在’error:’之前找到最近出现的’GET'(GET zzzz)并捕获其间的所有文本. GET xxxxxGET yyyyyGET zzzzzSome textmore texterror: this is an error 可以这样做吗? 编辑 谢谢,awk解决方案有效,但是通过最后出现’错误:’可以进一步改善吗? GET xxxxx
我需要在’error:’之前找到最近出现的’GET'(GET zzzz)并捕获其间的所有文本.

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

可以这样做吗?

编辑

谢谢,awk解决方案有效,但是通过最后出现’错误:’可以进一步改善吗?

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

这假设必须只打印一个块,并且还应打印错误:行. (更新:请参阅下面的解决方案,仅打印最后一个块).

> / ^ GET / {删除行; C = 0;每当在行的开头遇到字符串GET时,inBlock = 1}开始在可变行中构建一个行数组.
> / ^错误:/ {for(i = 1; i< = c; i)print lines [i];打印; exit}匹配字符串错误:在行的开头打印出到目前为止构建的所有行,然后是当前行,然后退出.
> inBlock {lines [c] = $0}将从最近的GET行开始的每一行添加到数组中.

根据OP的要求更新:

要(仅)报告以错误:结尾的最后一个块,请使用以下命令:

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块中处理完所有输入之后打印.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读