Fra Awk-programmeringssproget
Funktionen
sub ( r, s , t )
finder først længst til venstre længst matchet med det regulære udtrykr
i målstrengent
; det erstatter derefter understrengen med substitutionsstrengens
.Funktionen
sub(r,s)
er et synonym forsub(r,s,$0)
.I
sub ( /ana/, "anda" , "banana" )
f.eks. erstattesbanana
medbandada
.
Efter at have kørt sub ( r, s , t )
, hvordan kan jeg få den nye streng? For eksempel i sub ( /ana/, "anda" , "banana" )
hvordan kan jeg få den nye streng bandada
?
Underfunktionen returnerer antallet af udskiftninger.
Er returneringen af sub
enten 0 eller 1? Er det korrekt, at det ikke kan være mere end en, fordi sub
kun finder det første match og erstatter det?
Tak.
Svar
Fra GNU awk manual 9.1.3 Funktioner for strengmanipulation :
… det tredje argument til
sub()
skal være et variabel-, felt- eller array-element. Nogle versioner af awk tillader det tredje argument at være et udtryk, der ikke er en værdi. I et sådant tilfældesub()
søger stadig efter mønsteret og returnerer nul eller et, men resultatet af erstatning (hvis nogen) kastes, fordi der ikke er noget sted at sætte det. Sådanne versioner af awk accepterer udtryk som følgende:
sub(/USA/, "United States", "the USA and Canada")
For historisk kompatibilitet accepterer gawk en sådan fejlagtig kode. Brug af ethvert andet ikke-udskifteligt objekt som den tredje parameter medfører en fatal fejl, og dit program kører ikke.
= “9e1a869f5d”>
Så svaret er at bruge en variabel:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana