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 regularr
en la cadena de destinot
; luego reemplaza la subcadena por la cadena de sustitucións
.La función
sub(r,s)
es sinónimo desub(r,s,$0)
.En
sub ( /ana/, "anda" , "banana" )
, por ejemplo,banana
se reemplaza porbandada
.
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