Encontrei uma resposta em outro site que estava sugerindo grep -oP '^\w+|$
. Apontei que o |$
é inútil no PCRE, pois significa apenas "OU fim de linha" e, portanto, sempre será verdadeiro para linhas regulares. No entanto, não consigo descobrir exatamente o que ele faz em GNU grep
PCREs quando combinado com -o
. Considere o seguinte:
$ printf 'ab\na\nc\n\n' | perl -ne 'print if /ab|$/'
ab
a
c
$
(Estou incluindo o segundo $
caractere de prompt ( ) para mostrar que a linha vazia está incluída nos resultados).
Como esperado, em Perl, isso corresponderá a todas as linhas. Ou porque contém um ab
ou porque $
corresponde ao final da linha. O GNU grep
se comporta da mesma maneira sem o -o
sinalizador:
$ printf 'ab\na\nc\n\n' | grep -P 'ab|$'
ab
a
c
$
No entanto, -o
altera o comportamento:
$ printf 'ab\na\nc\n\n' | grep -oP 'ab|$'
ab
$
Isso é o mesmo que simplesmente grepping para ab
. A segunda parte, o "OU fim de linha" parece ser ignorada. Funciona como esperado sem o -o
sinalizador:
O que está acontecendo? - o
ignora correspondências de comprimento 0? Isso é um bug ou é esperado?
Minha página de manual do GNU grep diz o seguinte:
ênfase é minha
Eu estou supondo que considera a correspondência de fim de linha como uma "correspondência vazia"
Lados de um OR
A segunda parte, o "OU fim de linha" parece ser ignorada.
Não, não é, se mudarmos um pouco a correspondência:
Ambas as partes do OR são explicitamente correspondidas.
Correspondência vazia
O que é ignorado são correspondências "vazias" (a string resultante tem comprimento zero):
Está documentado (em GNU grep)
LESS=+'/^ *-o,' man grep
(ênfase minha):