本案:
$ cat t01.txt
xxxyyyzzz
$ cat t01.txt | grep -Po '(?<=xxx).*(?=zzz)'在以下方面的成果:
yyy这是意料之中的。
然而,本案:
$ cat t02.txt
xxx
yyy
zzz
$ cat t02.txt | grep -Pzo '(?<=xxx).*(?=zzz)'在以下方面的成果:
这是出乎意料的。
为什么以及如何修复?
发布于 2021-11-23 15:39:05
因为默认情况下,.与Perl中的换行符不匹配。您需要显式地匹配它,或者在正则表达式中使用s标志:
$ < t02.txt grep -Pzo '(?<=xxx\n).*\n(?=zzz)'
yyy
$ < t02.txt grep -Pzo '(?s)(?<=xxx).*(?=zzz)'
yyy例如,见perlre手册页:
在“元字符”一节中:
。匹配除在/s下,包括换行符中没有的换行符以外的任何单个字符
在“修饰语”中:
s将字符串视为单行。也就是说,更改"."以匹配任何字符,甚至换行符,这通常是不匹配的。
发布于 2021-11-23 15:40:32
这实际上是预期的行为。.包括除换行符以外的任何字符。您要寻找的正则表达式是:
(?<=xxx)\n*.*\n*(?=zzz)这里有一个很好的站点来测试你的正则表达式,它也解释了它的每个部分,所以你总是知道为什么它的行为是这样的:https://regex101.com
https://unix.stackexchange.com/questions/678744
复制相似问题