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ásed
interpretovat vzor jako vzor ERE (Extended Regular Expression);> out
:přesměrujestdout
out
;
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á2
postava:
: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á2
postava:
: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