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$/
.