Na verdade, essa é uma pergunta interessante. @tink apontou porque seu código não funciona como esperado, mas essa não foi a questão. A pergunta era "por que 0
às vezes corresponde".
Se (/foo/ ~ $1)
realmente significa (($0 ~ /foo/) ~ $1)
, então ($0 ~ /foo/)
será avaliado como 1
se a linha contiver foo
e 0
caso contrário. Assim, você está (principalmente) avaliando 0 ~ $1
. Se a linha de entrada estiver vazia, então $1 == ""
e uma expressão regular vazia sempre corresponderão. Se a linha de entrada for exatamente 0
, o mesmo será $1
e 0 ~ 0
será true. Se a linha de entrada for 000
, por exemplo, o mesmo acontecerá com $1
e 0 ~ 000
não deverá ser verdadeiro. No entanto, é provável que o 000
seja convertido em 0
antes de a correspondência ser verificada.
Mas, infelizmente, essa explicação não cobre todos os casos.
Caso 1
0 <-- found match
a
0 <-- found match
0 <-- found match
Isso é exatamente como esperado.
Caso 2
0 <-- found match
00 00 <-- found match
0 <-- found match
Isso também é o esperado, desde que qualquer número de zeros seja interpretado como 0
. Mas agora, isso:
Caso 3
0 <-- found match
a
00 0
0
Isso não pode ser explicado de maneira tão simples. Depois de uma correspondência com falha, a conversão para zero não parece acontecer e as linhas seguintes devem corresponder a não.
Caso 4
0 <-- found match
a
00 00
a
0 <-- found match
Aconteça o que acontecer, outra correspondência com falha parece redefinir o comportamento de awk
para normal e a correspondência funciona conforme o esperado novamente.
Para concluir, a explicação da página GNU awk
man, que não faz parte da página de informações, por acaso, está incorreta (ou, no mínimo, incompleta), ou o programa contém um bug. / p>