Z programovacího jazyka Awk
Funkce
sub ( r, s , t )
nejprve najde nejdelší podřetězec zcela vlevo odpovídající regulárnímu výrazur
v cílovém řetězcit
; poté 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 nahrazenbandada
.
Jak lze po spuštění sub ( r, s , t )
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ávrat sub
buď 0 nebo 1? Je správné, že to nemůže být více než jedna, protože sub
najde pouze první shodu a nahradí ji?
Díky.
Odpověď
Z příručky GNU awk 9.1.3 Funkce manipulace s řetězci :
… třetí argument pro
sub()
musí být proměnná, pole nebo prvek pole. Některé verze awk umožňují, aby byl třetím argumentem výraz, který není hodnotou l. V takovém případěsub()
stále hledá vzor a vrátí nulu nebo jednu, ale výsledek substituce (pokud existuje) je zahozena, protože ji není kam umístit. 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á tento chybný kód. Použití jiného jiného nevyměnitelného objektu jako třetího parametru však způsobí závažnou chybu a váš program se nespustí.
Takže odpovědí je použití proměnné:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana