Используйте
sed '/#start/,/#end/replace_command'
Например, если файл называется myconfig
,
и вы хотите заменить "разрешить "с" запретить "в этом разделе можно сказать
sed '/#start/,/#end/s/allow/deny/' myconfig
. Это оставит файл нетронутым и отобразит в стандартном выводе
, как файл будет выглядеть после модификации.
Вам, вероятно, следует сделать это в первую очередь,
чтобы убедиться, что вы правильно поняли команду.
Если вы действительно хотите изменить файл, добавьте параметр -i
:
sed -i '/#start/,/#end/s/allow/deny/' myconfig
Если вы хотите заменить весь текст ( все текст) между этими двумя строками, вы можете сделать что-то более простое, чем ответ Лукаса :
sed '/#start/,/#end/c\ New text line 1\ New text line 2\ ︙ \ New text line n-1\ New text line n (last)' ← Close quote; no backslash here
c
это c hange в sed
(и ed
);
это означает «заменить всю строку (строки)».
Нельзя просто оставить строки #start
и #end
нетронутыми.
Если вы хотите сохранить их, вы должны снова вставить их:
sed -i '/#start/,/#end/c\
#start\
FirewallRuleSet global {\
FirewallRule allow tcp to google.com\
FirewallRule deny tcp to facebook.com\
︙ \
\
#more rules\
}\
#end' myconfig
/ # start /, / # end /
указывает диапазон -
строки из первой строки, содержит #start
через первую строку после той, которая содержит #end
.
Если вам нужно найти строки, содержащие эти строки и ничего больше,
используйте / ^ # start $ /, / ^ # end $ /
.