Por que o início e o fim de uma linha correspondem ao [.]*
e como evitá-lo?
Parece que o padrão corresponde ao limite do Word, mas não tenho certeza se foi projetado e qual especificação ele implementa.
$ echo " a " | sed -n 's/[.]*/X/pg'
X XaX X
$ echo " a " | sed -n 's/[\b]*/X/pg'
X XaX X
Observe que
\b
os colchetes não têm nenhum significado especial. É apenas uma lista de personagens.[.]*
e[\b]*
corresponda a zero ou mais caracteres entre colchetes.Portanto, eles correspondem a qualquer execução de um ou mais caracteres, onde as strings vazias imediatamente anteriores e posteriores a uma execução do(s) caractere(s) são apenas parte dessa execução.
Eles também correspondem a qualquer sequência vazia que não seja imediatamente precedida ou seguida por uma sequência do(s) caractere(s).
Substituindo o espaço por algo mais visível, sua entrada é:
sas
Nenhum dos caracteres
.
nem aparece na string. Portanto, não há corridas de comprimento um ou mais. Com esta entrada, ambos e são equivalentes a "corresponder à string vazia".\
b
[.]*
[\b]*
s
correspondênciass
ea
matchesa
e as segundass
correspondênciass
as correspondências do segundo e do final da linhaEssas 4 correspondências explicam os
X
s adicionados à saída do seu exemplo.Usar
\b
para significar limite de palavra não é padrão, embora algumas versõessed
o aceitem (ou o relacionado\<
e\>
).É mais seguro não usar esta extensão e certamente não com
*
.Mesmo versões disso
sed
parecem apoiá-lo, produzindo resultados não intuitivos e inconsistentes.Por exemplo, com GNU sed 4.8:
Com busybox sed 1.30.1:
Até mesmo outros programas como Perl requerem cuidados: