From the Awk Programming Language
Funktionen
sub ( r, s , t )
hittar först längst längst till vänster som matchas av det reguljära uttrycketr
i målsträngent
; den ersätter sedan understrängen med substitutionssträngens
.Funktionen
sub(r,s)
är en synonym försub(r,s,$0)
.I
sub ( /ana/, "anda" , "banana" )
, till exempel,banana
ersätts medbandada
.
Hur kan jag få den nya strängen efter att ha kört sub ( r, s , t )
? Till exempel, i sub ( /ana/, "anda" , "banana" )
, hur kan jag få den nya strängen bandada
?
Underfunktionen returnerar antalet gjorda byten.
Är returneringen av sub
antingen 0 eller 1? Är det korrekt att det inte kan vara mer än en, eftersom sub
bara hittar den första matchningen och ersätter den?
Tack.
Svar
Från GNU awk-handboken 9.1.3 Funktioner för strängmanipulation :
… det tredje argumentet till
sub()
måste vara ett variabel-, fält- eller arrayelement. versioner av awk tillåter det tredje argumentet att vara ett uttryck som inte är ett värde. I ett sådant fall sökersub()
fortfarande efter mönstret och returnerar noll eller en, men resultatet av ersättning (om någon) kastas eftersom det inte finns någon plats att uttrycka det. Sådana versioner av awk accepterar uttryck som följande:
sub(/USA/, "United States", "the USA and Canada")
För historisk kompatibilitet accepterar gawk en sådan felaktig kod. Användning av andra icke-utbytbara objekt som den tredje parametern orsakar dock ett allvarligt fel och ditt program kommer inte att köras.
Så, svaret är att använda en variabel:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana