Em bash
, '...'
são aspas strongs, então com '\n'
, um literal \n
é passado para awk
e com '\n'
, um literal \n
. Não há transformação.
Em awk
, dentro de "..."
, \n
e \
... são expandidos. Assim, quando passado "\n"
a gensub()
(ou print
ou qualquer coisa em awk
), esse é um caractere de nova linha real e, quando passado "\"
, é \
.
Agora, gensub()
também entende seu primeiro argumento como uma expressão regular, em que \
também tem um significado especial que varia entre as implementações.
O que é consistente entre as implementações é que \
regexp corresponde a um literal \
, assim como \.
corresponde a um literal .
. No entanto, para um \n
regexp, se isso corresponde a um caractere de nova linha ou a n
varia com a implementação. No caso de gawk
, que corresponde à nova linha. Portanto, gensub("\n", "x")
e gensub("\n", "x")
substituem caracteres de nova linha por x
, o primeiro porque um caractere literal de nova linha é passado para gensub()
, o segundo porque \n
é passado para gensub()
, que é entendido como um regexp que corresponde a um caractere de nova linha.
Observe que a especificação POSIX costumava ter vários problemas quando se tratava de processamento de contrabarra em expressões regulares em awk
. Isso será corrigido na próxima versão da especificação. Consulte o link para obter detalhes.
Fica ainda mais confuso ao usar /\n/
em vez de "\n"
.