这个案例:
$ 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)'
结果是:
<nothing>
这是出乎意料的。
为什么以及如何解决?
这个案例:
$ 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)'
结果是:
<nothing>
这是出乎意料的。
为什么以及如何解决?
因为默认情况下,
.
不匹配 Perl 正则表达式中的换行符。您需要明确匹配它,或者使用s
正则表达式的标志:参见例如
perlre
手册页:在“元字符”部分:
在“修饰符”中:
这实际上是预期的行为。
.
包括除换行符以外的任何字符。您正在寻找的正则表达式是:这是一个测试你的正则表达式的好网站,它也解释了它的每一部分,所以你总是知道它为什么会这样:https ://regex101.com