首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用pcregrep实现grep多行

用pcregrep实现grep多行
EN

Stack Overflow用户
提问于 2019-09-13 19:10:41
回答 3查看 764关注 0票数 1

我有一个具有以下模式的文件。

代码语言:javascript
复制
Foo $var1
.........
.........

Foo $var2 
..........
..........
..........
Yes

我只想匹配以"Foo“开头并有”是“的”区段“。(您会注意到,在每个部分的末尾都有一个空行提要)

预期的产出应该是。

代码语言:javascript
复制
Foo $var2 
..........
..........
..........
Yes

我试过了

pcregrep -M "^Foo(.|\n)*^Yes“

但不幸的是,这开始从前一节开始匹配,并将倒数第二部分与以"Yes“作为返回匹配的部分一起转储,因此我没有一个以"Foo”开头并有“是”的部分,但与以前一样多以"Foo“开头的部分。

我的两难处境是,如果在这一节的末尾,虽然我匹配了"Foo“,却看不到”是“,那么如何放弃上一场比赛。

我尝试使用lookbehind函数,但它不能用于可变长度。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-14 10:22:27

您可以在字符串开始时使用匹配Foo,然后匹配所有不以Yes或Foo开头的行。

如果Foo和Yes不应该是较大单词的一部分,则可以使用单词边界\b

代码语言:javascript
复制
^Foo\b.*(?:\n(?!Yes\b|Foo\b).*)*\nYes\b

各部分

  • 字符串的^开始
  • Foo\b.*匹配Foo后面跟着0+乘以除换行符以外的任何字符
  • (?:非捕获群
    • \n匹配换行符
    • (?!Yes\b|Foo\b)负前瞻,在右边不直接断言是或Foo
    • .*匹配除换行符以外的任何字符0+时间。

  • )*关闭组和重复0+时间
  • \nYes\b

Regex演示

例如

代码语言:javascript
复制
pcregrep -Mo '^Foo\b.*(?:\n(?!Yes\b|Foo\b).*)*\nYes\b' file

输出

代码语言:javascript
复制
Foo $var2
..........
..........
..........
Yes
票数 1
EN

Stack Overflow用户

发布于 2019-09-14 07:02:41

如果可以使用gnu awk,则可以使awk在如下块模式下工作:

代码语言:javascript
复制
awk -v RS='Foo' -v ORS='' '/Yes/ {print RS$0}' file
Foo $var2
..........
..........
..........
Yes
票数 0
EN

Stack Overflow用户

发布于 2019-09-13 20:49:47

如果您使用的是支持PCRE的grep,这样的

只有那些Foo有一个

请注意,我不确定grep是否会跨线。

可能吧,但我个人不知道。

(?m)^Foo\K(?:(?!^Foo)[\S\s])+(?=^Yes)

https://regex101.com/r/HCrcGO/1

扩容

代码语言:javascript
复制
 (?m)
 ^ Foo
 \K 
 (?:
      (?! ^ Foo )
      [\S\s] 
 )+
 (?= ^ Yes )
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57929159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档