From The Awk Programming Language
Funksjonen
sub ( r, s , t )
finner først lengst til lengste understreng matchet med det regulære uttrykketr
i målstrengent
; den erstatter deretter substringen med substitusjonsstrengens
.Funksjonen
sub(r,s)
er et synonym forsub(r,s,$0)
.I
sub ( /ana/, "anda" , "banana" )
, for eksempel,banana
erstattes medbandada
.
Hvordan kan jeg få den nye strengen etter å ha kjørt sub ( r, s , t )
? For eksempel, i sub ( /ana/, "anda" , "banana" )
, hvordan kan jeg få den nye strengen bandada
?
Underfunksjonen returnerer antall utskiftninger som er gjort.
Er retur av sub
enten 0 eller 1? Er det riktig at det ikke kan være mer enn ett, fordi sub
bare finner den første kampen og erstatter den?
Takk.
Svar
Fra GNU awk manualen 9.1.3 String-Manipulation Funksjoner :
… det tredje argumentet til
sub()
må være et variabel-, felt- eller array-element. Noen versjoner av awk tillater det tredje argumentet å være et uttrykk som ikke er en verdi. I et slikt tilfelle søkersub()
fremdeles etter mønsteret og returnerer null eller ett, men resultatet av erstatning (hvis noen) kastes fordi det ikke er noe sted å si det. Slike versjoner av awk godtar uttrykk som følgende:
sub(/USA/, "United States", "the USA and Canada")
For historisk kompatibilitet godtar gawk en slik feilkode. Bruk av andre ikke-utskiftbare objekter som den tredje parameteren forårsaker en alvorlig feil, og programmet vil ikke kjøre.
Så, svaret er å bruke en variabel:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana