Dal linguaggio di programmazione Awk
La funzione
sub ( r, s , t )trova prima la sottostringa più lunga più a sinistra corrispondente allespressione regolarernella 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,bananaviene 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