Da linguagem de programação Awk
A função
sub ( r, s , t )
primeiro encontra a substring mais longa à esquerda correspondida pela expressão regularr
na string de destinot
; ele então substitui a substring pela string de substituiçãos
.A função
sub(r,s)
é um sinônimo desub(r,s,$0)
.Em
sub ( /ana/, "anda" , "banana" )
, por exemplo,banana
é substituído porbandada
.
Depois de executar sub ( r, s , t )
, como posso obter a nova string? Por exemplo, em sub ( /ana/, "anda" , "banana" )
, como posso obter a nova string bandada
?
A subfunção retorna o número de substituições feitas.
O retorno de sub
é 0 ou 1? É correto dizer que não pode “ser mais de um, porque sub
apenas encontra a primeira correspondência e substitui-a?
Obrigado.
Resposta
Do manual GNU awk 9.1.3 Funções de manipulação de string :
… o terceiro argumento para
sub()
deve ser uma variável, campo ou elemento de matriz. Alguns versões do awk permitem que o terceiro argumento seja uma expressão que não é um lvalue. Nesse caso,sub()
ainda procura o padrão e retorna zero ou um, mas o resultado do substituição (se houver) é descartada porque não há lugar para colocá-la. Essas versões do awk aceitam expressões como as seguintes:
sub(/USA/, "United States", "the USA and Canada")
Para compatibilidade histórica, o gawk aceita esse código errado. No entanto, usar qualquer outro objeto não alterável como o terceiro parâmetro causa um erro fatal e seu programa não será executado.
Portanto, a resposta é usar uma variável:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana