Dónde obtener la nueva cadena después de ejecutar `sub` en awk

Del lenguaje de programación Awk

La función sub ( r, s , t ) primero encuentra la subcadena más larga a la izquierda que coincide con la expresión regular r en la cadena de destino t; luego reemplaza la subcadena por la cadena de sustitución s.

La función sub(r,s) es sinónimo de sub(r,s,$0).

En sub ( /ana/, "anda" , "banana" ), por ejemplo, banana se reemplaza por bandada.

Después de ejecutar sub ( r, s , t ), ¿cómo puedo obtener la nueva cadena? Por ejemplo, en sub ( /ana/, "anda" , "banana" ), ¿cómo puedo obtener la nueva cadena bandada?

La subfunción devuelve el número de sustituciones realizadas.

¿El retorno de sub es 0 o 1? ¿Es correcto que «no puede ser más de uno, porque sub solo encuentra la primera coincidencia y reemplázala?

Gracias.

Respuesta

Del manual de GNU awk 9.1.3 Funciones de manipulación de cadenas :

… el tercer argumento de sub() debe ser una variable, campo o elemento de matriz. Algunos las versiones de awk permiten que el tercer argumento sea una expresión que no es un valor l. En tal caso, sub() aún busca el patrón y devuelve cero o uno, pero el resultado de la la sustitución (si existe) se descarta porque no hay lugar para colocarla. Tales versiones de awk aceptan expresiones como las siguientes:

sub(/USA/, "United States", "the USA and Canada")

Por compatibilidad histórica, gawk acepta este tipo de código erróneo. Sin embargo, el uso de cualquier otro objeto no modificable como tercer parámetro causa un error fatal y su programa no se ejecutará.

Entonces, la respuesta es usar una variable:

awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *