Příklad:
1:20 2:25 3:0.432 2:-17 10:12
Chci nahradit všechny řetězce, které začínají s 2: na 2:0 .
Výstup:
1:20 2:0 3:0.432 2:0 10:12
Přijatá odpověď:
Pomocí sed :
sed -E 's/((^| )2:)[^ ]*/\10/g' in > out
Také, jak je inspirováno souravcovou odpovědí, pokud ne šance na 2: podřetězec za začátkem řetězce ne obsahující úvodní 2: podřetězec (např. není šance na 1:202:25 řetězec, který by následující zkrácený příkaz nahradil na 1:202:0 ), příkaz může být zkrácen na toto:
sed -E 's/2:[^ ]*/2:0/g' in > out
Rozdělení příkazu č. 1 / č. 2 :
-E:dělásedinterpretovat vzor jako vzor ERE (Extended Regular Expression);> out:přesměrujestdoutout;
sed rozbor příkazu č. 1 :
s:tvrdí, že provede substituci/:spustí vzor(:spustí snímací skupinu(:spustí seskupování povolených řetězců^:odpovídá začátku řádku|:odděluje druhý povolený řetězec:odpovídápostava):zastaví seskupování povolených řetězců2:odpovídá2postava::odpovídá:postava):zastaví snímací skupinu[^ ]*:odpovídá libovolnému počtu znaků, nikoli/:zastaví vzor / spustí náhradní řetězec\1:zpětná reference nahrazena první skupinou zachycení:přidápostava/:zastaví nahrazující řetězec / spustí příznaky vzorug:požaduje provést substituci globálně, tj. nahradit každý výskyt vzoru v řádku
sed členění příkazu č. 2 :
s:tvrdí, že provede substituci/:spustí vzor2:odpovídá2postava::odpovídá:postava[^ ]*:odpovídá libovolnému počtu znaků, nikoli/:zastaví vzor / spustí náhradní řetězec2:0:přidá2:0řetězec/:zastaví nahrazující řetězec / spustí příznaky vzorug:požaduje provést substituci globálně, tj. nahradit každý výskyt vzoru v řádku