Eu li sobre o comportamento de divisão do Awk aqui:
[...] o argumento fs para a função split (veja String Functions) deve ser interpretado como expressões regulares estendidas. Estes podem ser tokens ERE ou expressões arbitrárias e devem ser interpretados da mesma maneira que o lado direito do operador
~
ou .!~
e:
Se o operando do lado direito for qualquer expressão diferente do token léxico ERE , o valor da string da expressão deve ser interpretado como uma expressão regular estendida, incluindo as convenções de escape descritas acima.
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_04
No entanto, notei um resultado inesperado, com este código:
BEGIN {
print split("te.st", q, ".")
}
Eu esperaria que o .
representasse qualquer personagem e que o resultado fosse 6
. No entanto, todos os meus testes retornaram 2
. A execução deste código fornece o esperado 6
:
BEGIN {
print split("te.st", q, /./)
}
Testado com:
- bocejar
- gawk --posix
- 1.3.4
- 1.3.3
- nawk (original-awk)
Estou entendendo mal a documentação ou isso é um erro?
Isso não é um erro; é só que o padrão não é claro o suficiente ao tentar codificar a prática existente.
O manual do mawk(1) é mais explícito:
Além disso, o manual GNU awk das fontes atuais :
Esta é a descrição do padrão susv4 :
Seu exemplo corresponde a 2.b.
Mesmo que isso mencione explicitamente
FS
, é o mesmo comportamento com qualquer argumento usado em vez dele como o terceiro argumentosplit
em todas as implementações de awk, inclusive no caso em que esse argumento é um espaço.É improvável que o comportamento mude, porque a
FS
variável é apenas uma string (awk
não tem objetos regexp, comojavascript
ouperl
; você não pode atribuir um regexp a uma variável, como ema=/./
ou$a=qr/./
); é asplit
função (chamada implícita ou explicitamente) que interpreta seu argumento conforme descrito acima.A origem deste comportamento pode ser a compatibilidade com o "antigo" awk, onde
FS
(ou o 3º argumento parasplit
) sempre foi tratado como um único caractere. Exemplo (no unix v7):