我有一个具有以下模式的文件。
Foo $var1
.........
.........
Foo $var2
..........
..........
..........
Yes我只想匹配以"Foo“开头并有”是“的”区段“。(您会注意到,在每个部分的末尾都有一个空行提要)
预期的产出应该是。
Foo $var2
..........
..........
..........
Yes我试过了
pcregrep -M "^Foo(.|\n)*^Yes“
但不幸的是,这开始从前一节开始匹配,并将倒数第二部分与以"Yes“作为返回匹配的部分一起转储,因此我没有一个以"Foo”开头并有“是”的部分,但与以前一样多以"Foo“开头的部分。
我的两难处境是,如果在这一节的末尾,虽然我匹配了"Foo“,却看不到”是“,那么如何放弃上一场比赛。
我尝试使用lookbehind函数,但它不能用于可变长度。
发布于 2019-09-14 10:22:27
您可以在字符串开始时使用匹配Foo,然后匹配所有不以Yes或Foo开头的行。
如果Foo和Yes不应该是较大单词的一部分,则可以使用单词边界\b
^Foo\b.*(?:\n(?!Yes\b|Foo\b).*)*\nYes\b各部分
^开始Foo\b.*匹配Foo后面跟着0+乘以除换行符以外的任何字符(?:非捕获群\n匹配换行符(?!Yes\b|Foo\b)负前瞻,在右边不直接断言是或Foo.*匹配除换行符以外的任何字符0+时间。
)*关闭组和重复0+时间\nYes\b例如
pcregrep -Mo '^Foo\b.*(?:\n(?!Yes\b|Foo\b).*)*\nYes\b' file输出
Foo $var2
..........
..........
..........
Yes发布于 2019-09-14 07:02:41
如果可以使用gnu awk,则可以使awk在如下块模式下工作:
awk -v RS='Foo' -v ORS='' '/Yes/ {print RS$0}' file
Foo $var2
..........
..........
..........
Yes发布于 2019-09-13 20:49:47
如果您使用的是支持PCRE的grep,这样的
只有那些Foo有一个是
请注意,我不确定grep是否会跨线。
可能吧,但我个人不知道。
(?m)^Foo\K(?:(?!^Foo)[\S\s])+(?=^Yes)
https://regex101.com/r/HCrcGO/1
扩容
(?m)
^ Foo
\K
(?:
(?! ^ Foo )
[\S\s]
)+
(?= ^ Yes )https://stackoverflow.com/questions/57929159
复制相似问题