Use
sed '/#start/,/#end/replace_command'
Por exemplo, se o arquivo for chamado myconfig ,
e você quer substituir "allow" por "deny" nessa seção, você poderia dizer
sed '/#start/,/#end/s/allow/deny/' myconfig
Isso deixaria o arquivo intacto e exibido na saída padrão
como ficaria o arquivo após a modificação.
Você provavelmente deveria fazer isso primeiro,
para verificar se você tem o comando certo.
Se você quiser realmente alterar o arquivo, adicione a opção -i :
sed -i '/#start/,/#end/s/allow/deny/' myconfig
Se você quiser substituir o texto todo ( todos o texto) entre essas duas linhas, você pode fazer algo um pouco mais simples do que de Lucas resposta :
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 é o c comando hange em sed (% eed);
significa "substituir linhas inteiras".
Você não pode simplesmente deixar as linhas #start e #end intocadas.
Se você quiser mantê-los, você deve reinseri-los:
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/ especifica um intervalo -
as linhas da primeira linha que contém #start
através da primeira linha depois que contém #end .
Se você precisar encontrar linhas que contenham essas cadeias de caracteres e nada mais,
use /^#start$/,/^#end$/ .