GNU/Linux >> Znalost Linux >  >> FreeBSD

Freebsd – Bsd Sed:Nahradit pouze N-tý výskyt vzoru?

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ďte s náhradní příkaz za 2 pouze výskyt. t zda je substituce úspěšná nebo ne. Pokud ano, narazíme na smyčku :2 , jinak opakujte smyčku s b1 .

  • 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
  1. Nahraďte chytré uvozovky příkazem sed pro Linux

  2. Pomocí Sed k vyhledání a nahrazení čáry mezi rozsahy vzorů

  3. Najít číslo řádku, které obsahuje vzor, ​​pomocí vlastního oddělovače regulárního výrazu?

  1. Ponechat pouze první řádek z každé sekvence po sobě jdoucích řádků, které odpovídají vzoru?

  2. Sed:Vytisknout pouze první výskyt shody vzoru?

  3. Najít pouze první výskyt pouze pomocí Grepu?

  1. Jak nahradit řetězec v souboru (souborech)?

  2. Vrátit pouze odpovídající řetězec v Sed?

  3. Multi-Line Sed Vyměnit