Eu sei que awk
pode fazer substituição de texto / string com sub()
e gsub()
como:
kent$ echo "fffff"|awk '{gsub("f", "b")}1'
bbbbb
ou
kent$ echo "fffff"|awk '{gsub(/f/, "b")}1'
bbbbb
No entanto, hoje cometi um erro de digitação, escrevi a linha como:
kent$ echo "fffff"|awk '{gsub('f', "b")}1'
Mas awk
não reclamei disso, mas gerou uma saída como de costume, é claro, uma saída inesperada, levei algum tempo para descobrir o erro. A saída que awk
me deu foi:
bfbfbfbfbfb
outro exemplo:
kent$ echo "fafafafafXX"|awk '{gsub('fa', "B")}1'
BfBaBfBaBfBaBfBaBfBXBXB
exemplo com também sub()
é estranho:
kent$ echo "thanks in advance"|awk '{sub('a', "B")}1'
Bthanks in advance
Alguém poderia me explicar como foi feita a estranha substituição?
kent$ awk --version
GNU Awk 4.0.2
EDITAR
obrigado pela resposta de Joni. talvez este exemplo explique melhor, eu apenas adiciono aqui:
kent$ echo "thanks in advance"|awk '{f="k";sub('f', "B")}1'
thanBs in advance
kent$ echo "thanks in advance"|awk '{sub('th ank', "B")}1'
awk: cmd. line:2: {sub(th
awk: cmd. line:2: ^ unexpected newline or end of string
Quando você escreve
echo "fffff"|awk '{gsub('f', "b")}1'
o que awk vê é {gsub(f, "b")}1
. Ele interpreta f
como uma variável, com um valor vazio, e substitui cada string vazia na entrada por b.
A cadeia vazia é encontrada entre cada caractere e após o último, então o awk insere um b
após cada f
.
Você pode substituir //
ou ""
pelo mesmo efeito, sem uma variável não utilizada:
echo "fffff"|awk '{gsub(//, "b")}1' # fbfbfbfbfb
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras