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.
-
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ěť. -
Znám
sedlze 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).
-
Jak zmínil Bruce Ediger funkce append
exkteré začínajíakončí 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? -
ex'sdd'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).