Waar de nieuwe string te krijgen na het uitvoeren van `sub` in awk

Van de Awk-programmeertaal

De functie sub ( r, s , t ) vindt eerst de meest linkse langste deelstring die overeenkomt met de reguliere expressie r in de doeltekenreeks t; het vervangt dan de substring door de substitutietekenreeks s.

De functie sub(r,s) is een synoniem voor sub(r,s,$0).

In sub ( /ana/, "anda" , "banana" ), banana wordt bijvoorbeeld vervangen door bandada.

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 zoekt sub() 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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *