Onde obter a nova string após executar `sub` no awk

Da linguagem de programação Awk

A função sub ( r, s , t ) primeiro encontra a substring mais longa à esquerda correspondida pela expressão regular r na string de destino t; ele então substitui a substring pela string de substituição s.

A função sub(r,s) é um sinônimo de sub(r,s,$0).

Em sub ( /ana/, "anda" , "banana" ), por exemplo, banana é substituído por bandada.

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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *