Isso não é trivial. Se você puder assumir que cada bloco {}
não contém outros blocos {}
aninhados, é mais fácil e você pode fazer algo assim:
perl -pe 'if(/location\s*\/static/){$n=1}elsif(/}/){$n=0} s/^/#/ if $n==1;' file
Isso simplesmente define $n
a 1
se a linha atual corresponder a location /static
e a definir de volta para 0
no primeiro }
encontrado depois de location/static
. Então, contanto que $n==1
, adicione um #
ao início da linha. O -p
flag faz com que o perl faça o loop automaticamente pelo arquivo de entrada e imprima cada linha.
Agora, se você pode ter blocos aninhados em profundidade arbitrária dentro dos blocos que deseja comentar, as coisas ficam mais complicadas. Por exemplo, se você tem algo assim:
location /static {
if(foo){
print "one";
}
elsif(bar){
print "two";
}
}
Para casos como esse, a solução simples acima falhará e você terá que usar um que controle o número de {
aberto. Por exemplo (este é realmente um one-liner, você pode copiar / colar diretamente no seu terminal, eu apenas o expandi para clareza):
perl -pe 'if(/location\s*\/static/){$n=1;}
elsif(/}/ && $open==0){$n=0}
if($n==1 && /{/){$open++} ## count open brackets
elsif($n==1 && /}/){$open--} ## count closing brackets
if($n==1 && $open>0){ s/^/#/}; ' file
Finalmente, se as soluções funcionarem conforme o esperado, você poderá adicionar o -i
flag para fazer as alterações no próprio arquivo:
perl -i -pe 'if(/location\s*\/static/){$n=1}elsif(/}/){$n=0} s/^/#/ if $n==1;' file