Dal linguaggio di programmazione Awk
La funzione sub ( r, s , t )
prima trova la sottostringa
più a sinistra più lunga che corrisponde all'espressione regolare r
nella stringa di destinazione
t
; quindi sostituisce la sottostringa con la stringa di sostituzione
s
.
La funzione sub(r,s)
è sinonimo di sub(r,s,$0)
.
In sub ( /ana/, "anda" , "banana" )
, ad esempio, banana
è
sostituito con bandada
.
Dopo aver eseguito sub ( r, s , t )
, come posso ottenere la nuova stringa?
Ad esempio, in sub ( /ana/, "anda" , "banana" )
, come posso ottenere la nuova stringa bandada
?
La funzione secondaria restituisce il numero di sostituzioni effettuate.
È il ritorno di sub
o 0 o 1? È corretto che non possa essere più di uno, perché sub
trovare solo la prima corrispondenza e sostituirla?
Grazie.
Risposta accettata:
Dal manuale GNU awk 9.1.3 Funzioni di manipolazione delle stringhe:
… il terzo argomento di sub()
deve essere un elemento variabile, campo o array
. Alcune versioni di awk consentono al terzo argomento di essere un'espressione
che non è un lvalue. In tal caso, sub()
cerca ancora
il pattern e restituisce zero o uno, ma il risultato della sostituzione
(se presente) viene eliminato perché non c'è posto per inserirlo
. Tali versioni di awk accettano espressioni come la seguente:
sub(/USA/, "United States", "the USA and Canada")
Per compatibilità storica
, gawk accetta tale codice errato. Tuttavia, l'utilizzo di qualsiasi
altro oggetto non modificabile come terzo parametro provoca un errore irreversibile
e il programma non verrà eseguito.
Quindi, la risposta è usare una variabile:
awk 'BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}'
bandana