Z programovacího jazyka Awk
Funkce
sub ( r, s , t )
nejprve najde nejdelší
podřetězec nejvíce vlevo odpovídající regulárnímu výrazur
v cílovém
řetězcit
; pak nahradí podřetězec substitučním
řetězcems
.Funkce
sub(r,s)
je synonymem prosub(r,s,$0)
.V
sub ( /ana/, "anda" , "banana" )
, napříkladbanana
je
nahrazenobandada
.
Po spuštění sub ( r, s , t )
, jak mohu získat nový řetězec?
Například v sub ( /ana/, "anda" , "banana" )
, jak mohu získat nový řetězec bandada
?
Funkce sub vrací počet provedených substitucí.
Je návratem sub
buď 0 nebo 1? Je správné, že nemůže být více než jeden, protože sub
najít pouze první shodu a nahradit ji?
Děkuji.
Přijatá odpověď:
Z příručky GNU awk 9.1.3 Funkce manipulace s řetězci:
… třetí argument pro
sub()
musí být prvek proměnné, pole nebo pole
. Některé verze awk umožňují, aby třetí argument byl výraz
, který není lvalue. V takovém případěsub()
stále hledá
vzor a vrací nulu nebo jedničku, ale výsledek
substituce (pokud existuje) je zahozen, protože jej není kam vložit
. Takové verze awk přijímají výrazy jako následující:
sub(/USA/, "United States", "the USA and Canada")
Kvůli historické
kompatibilitě gawk přijímá takový chybný kód. Použití jakéhokoli
jiného neměnného objektu jako třetího parametru však způsobí závažnou chybu
a váš program se nespustí.
Takže odpověď je použít proměnnou:
awk 'BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}'
bandana