Dal linguaggio di programmazione Awk
La funzione
sub ( r, s , t )
trova prima la sottostringa più lunga più a sinistra corrispondente allespressione regolarer
nella stringa di destinazionet
; quindi sostituisce la sottostringa con la stringa di sostituziones
.La funzione
sub(r,s)
è un sinonimo disub(r,s,$0)
.In
sub ( /ana/, "anda" , "banana" )
, ad esempio,banana
viene sostituito conbandada
.
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 sub restituisce il numero di sostituzioni effettuate.
Il ritorno di sub
è 0 o 1? È corretto che “non può essere più di uno, perché sub
trova solo la prima corrispondenza e la sostituisce?
Grazie.
Risposta
Dal manuale GNU awk 9.1.3 Funzioni di manipolazione delle stringhe :
… il terzo argomento di
sub()
deve essere un elemento variabile, campo o matrice. Alcuni versioni di awk consentono al terzo argomento di essere unespressione che non è un lvalue. In tal caso,sub()
cerca ancora il pattern e restituisce zero o uno, ma il risultato del la sostituzione (se esiste) viene scartata perché non cè posto dove metterla. Tali versioni di awk accettano espressioni come le seguenti:
sub(/USA/, "United States", "the USA and Canada")
Per compatibilità storica, gawk accetta questo codice errato. Tuttavia, lutilizzo di qualsiasi altro oggetto non modificabile come terzo parametro causa un errore irreversibile e il programma non verrà eseguito.
Quindi, la risposta è utilizzare una variabile:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana