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ýrazurv 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říkladbananaje 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