Var får man den nya strängen efter att ha kört ”sub” i awk

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 uttrycket r i målsträngen t; den ersätter sedan understrängen med substitutionssträngen s.

Funktionen sub(r,s) är en synonym för sub(r,s,$0).

I sub ( /ana/, "anda" , "banana" ), till exempel, banana ersätts med bandada.

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öker sub() 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 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *