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
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).
-
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? -
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).