GNU/Linux >> Znalost Linux >  >> Linux

Jak použít Sed nebo Ex k nahrazení bloku (víceřádkového kódu) novým blokem textu (kódu)?

Musím nahradit velký blok textu (kód skriptu shellu) v souboru jiným blokem textu.

Jsem ohromen tím, jak mohu použít sed k nahrazení víceřádkového řetězce? odpověděl
antak a Multi-line nahradit odpověděl Bruce Ediger

Ale mám nějaké potíže s jejich používáním.

  1. antak již ve své odpovědi zmínil, že streamování celého souboru (1h;2,$H;$!d;g; ) do vyrovnávací paměti není vhodné pro velké soubory, protože přetěžuje paměť.

  2. Znám sed lze použít s funkcí bloku k zachování textu mimo blok beze změny. Chci tuto funkci používat. Ale pokud použiji,

    sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
    

bude vkládat nový text (kód) opakovaně pro každý stream. Proto musím vytvořit vizuální blok jako jeden stream s použitím něčeho podobného tomu, co navrhl antak dříve, ale pro blok (ne pro celý soubor).

  1. Jak zmínil Bruce Ediger funkce append ex které začínají a končí na . (tečka) lze vyzkoušet, ale můj nový text (kód) obsahuje řádky začínající tečkou, kterou lze považovat za tečku syntaxe append. Jak jej mohu v této situaci použít?

  2. ex 's dd 'počet řádků' může smazat více řádků, ale pokud mám mezi /marker1/ a /marker2/ blok s nepevným počtem řádků (proměnlivý), má být nahrazen novým textem (kódem), jak to udělat?

Přijatá odpověď:

Doporučuji použít c příkaz hange
(což je v podstatě d elete ve spojení s a ppend, i když append se použije pouze pro poslední řádek v rozsahu, který je přesně to, co zde chcete):

sed -i '/marker1/,/marker2/c
New text 1
New text 2' filename

Zde pomocí GNU sed 's syntaxe pro úpravy na místě (-i ). To c příkaz je jinak standardní a přenosný. GNU sed podporuje:

sed '/marker1/,/marker2/cNew text 1
New text 2' filename

jako nestandardní rozšíření.

Znaky nového řádku a zpětného lomítka musí být v nahrazovaném textu uvozeny (se zpětným lomítkem).


Linux
  1. Jak použít Sed k výměně víceřádkového řetězce?

  2. Jak nahradit řetězec řetězcem obsahujícím lomítko se Sed?

  3. Může Sed nahradit nové řádkové znaky?

  1. Jak používám Vagrant s libvirt

  2. Jak mohu pomocí sed změnit své konfigurační soubory s flexibilními klíči a hodnotami?

  3. Jak použít sed k nahrazení proměnné konfiguračního souboru?

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

  2. Nahradit text více souborů textem Sed?

  3. Jak používat export s Pythonem na Linuxu