Este caso:
$ cat t01.txt
xxxyyyzzz
$ cat t01.txt | grep -Po '(?<=xxx).*(?=zzz)'
resulta em:
yyy
que é esperado.
No entanto, este caso:
$ cat t02.txt
xxx
yyy
zzz
$ cat t02.txt | grep -Pzo '(?<=xxx).*(?=zzz)'
resulta em:
<nothing>
o que é inesperado.
Por que e como corrigir?
Porque, por padrão, o
.
não corresponde à nova linha em regexes Perl. Você precisa corresponder explicitamente ou usar os
sinalizador para o regex:Veja, por exemplo, a
perlre
página man :Na seção "Metacaracteres":
e em "Modificadores":
Na verdade, é um comportamento esperado.
.
inclui qualquer caractere, exceto quebras de linha. a regex que você está procurando é:aqui está um bom site para testar seus regexes, ele tem explicação sobre cada parte dele também, então você sempre sabe por que ele se comporta assim: https://regex101.com