Van de Awk-programmeertaal
De functie
sub ( r, s , t )
vindt eerst de meest linkse langste deelstring die overeenkomt met de reguliere expressier
in de doeltekenreekst
; het vervangt dan de substring door de substitutietekenreekss
.De functie
sub(r,s)
is een synoniem voorsub(r,s,$0)
.In
sub ( /ana/, "anda" , "banana" )
,banana
wordt bijvoorbeeld vervangen doorbandada
.
Nadat ik sub ( r, s , t )
heb uitgevoerd, hoe kan ik de nieuwe string krijgen? Hoe kan ik bijvoorbeeld in sub ( /ana/, "anda" , "banana" )
de nieuwe string bandada
krijgen?
De subfunctie geeft het aantal gemaakte vervangingen terug.
Is de terugkeer van sub
0 of 1? Is het juist dat het “niet meer dan één kan zijn, omdat sub
alleen de eerste overeenkomst vindt en deze vervangt?
Bedankt.
Answer
Uit de GNU awk-handleiding 9.1.3 String-manipulatiefuncties :
… het derde argument voor
sub()
moet een variabele, een veld of een array-element zijn. versies van awk staan het derde argument toe een uitdrukking te zijn die geen lvalue is. In dat geval zoektsub()
nog steeds naar het patroon en retourneert nul of één, maar het resultaat van de vervanging (indien aanwezig) wordt weggegooid omdat er geen plaats is om het te plaatsen. Dergelijke versies van awk accepteren uitdrukkingen als de volgende:
sub(/USA/, "United States", "the USA and Canada")
Voor historische compatibiliteit accepteert gawk dergelijke foutieve code. Het gebruik van een ander niet-veranderbaar object als derde parameter veroorzaakt echter een fatale fout en uw programma zal niet worden uitgevoerd.
Het antwoord is dus om een variabele te gebruiken:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana