Kde získat nový řetězec po spuštění `sub` v awk

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ýrazu r v cílovém řetězci t; poté nahradí podřetězec substitučním řetězcem s.

Funkce sub(r,s) je synonymem pro sub(r,s,$0).

V sub ( /ana/, "anda" , "banana" ), například banana je nahrazen bandada.

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 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *