Mistä saada uusi merkkijono suoritettuasi `sub` in awk

Awk-ohjelmointikielestä

Funktio sub ( r, s , t ) etsii ensin vasemmanpuoleisen pisimmän alijonon, jota vastaa säännöllinen lauseke r kohdejonossa t; sitten se korvaa alimerkkijonon korvausmerkkijonolla s.

Funktio sub(r,s) on synonyymi sub(r,s,$0).

Kohdassa sub ( /ana/, "anda" , "banana" ), banana korvataan nimellä bandada.

Kuinka saan uuden merkkijonon suoritettuani sub ( r, s , t )? Esimerkiksi kohdassa sub ( /ana/, "anda" , "banana" ), kuinka saan uuden merkkijonon bandada?

Alitoiminto palauttaa tehtyjen korvausten määrän.

Onko sub paluu 0 tai 1? Onko oikein, että sitä ei voi olla enemmän kuin yksi, koska sub löytää vain ensimmäisen ottelun ja korvaa sen?

Kiitos.

vastaus

GNU awk -käyttöoppaasta 9.1.3 Merkkijonon manipulointitoiminnot :

sub(): n kolmannen argumentin on oltava muuttuja-, kenttä- tai taulukkoelementti. Jotkut awk-versiot sallivat kolmannen argumentin olla lauseke, joka ei ole arvo. Tällaisessa tapauksessa sub() etsii edelleen mallia ja palauttaa nollan tai yhden, mutta korvaaminen (jos sellainen on) heitetään pois, koska sitä ei ole paikkaa laittaa. Tällaiset awk-versiot hyväksyvät seuraavanlaiset lausekkeet:

sub(/USA/, "United States", "the USA and Canada")

Historiallisen yhteensopivuuden vuoksi gawk hyväksyy tällaisen virheellisen koodin. Minkä tahansa muun muuttumattoman objektin käyttäminen kolmannena parametrina aiheuttaa kuitenkin kohtalokkaan virheen, eikä ohjelmasi toimi.

Joten vastaus on käyttää muuttujaa:

awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *