Používání BSD sed
;
Jak mohu provést následující substituci?:
Před:
hello hello hello
hello hello hello
Po:
hello world hello
hello hello hello
Jinými slovy; jak mohu nahradit pouze ten N th výskyt vzoru?
(Nebo v tomto případě the 2 nd výskyt vzoru?)
Přijatá odpověď:
S jakýmkoli POSIX sed
:
$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
-
Po prvním zápase
/hello/
, dostaneme se do smyčky. -
Vnitřní smyčka
:1
, čteme každéN
ext line do prostoru vzorů, proveďtes
náhradní příkaz za2
pouze výskyt.t
zda je substituce úspěšná nebo ne. Pokud ano, narazíme na smyčku:2
, jinak opakujte smyčku sb1
. -
Vnitřní smyčka
:2
, vytiskneme pouze zbývající řádky do konce souboru.
Všimněte si, že tento přístup uloží všechny věci mezi dva ahoj ve vzorovém prostoru. Problém to bude s velkými soubory, kdy jsou první a druhý daleko od sebe.
Freebsd – podpora Twain Api na Freebsd?
Freebsd – Pole uživatelského jména změněno zpět uživatelem Passwd?