Questo non è banale. Se puoi presumere che ogni {}
blocco non contenga altri {}
blocchi nidificati , è più facile e puoi fare qualcosa del genere:
perl -pe 'if(/location\s*\/static/){$n=1}elsif(/}/){$n=0} s/^/#/ if $n==1;' file
Questa imposta semplicemente $n
a 1
se la linea corrente corrisponde location /static
e imposta di nuovo al 0
al primo }
trovato dopo il location/static
. Quindi, purché $n==1
, aggiunga #
a all'inizio della riga. Il -p
flag fa sì che perl esegua automaticamente il ciclo del file di input e stampi ogni riga.
Ora, se puoi avere blocchi annidati di profondità arbitraria all'interno dei blocchi che vuoi commentare, le cose diventano più complicate. Ad esempio, se hai qualcosa del genere:
location /static {
if(foo){
print "one";
}
elsif(bar){
print "two";
}
}
Per casi del genere, la semplice soluzione sopra non funzionerà e dovrai usarne una che tenga traccia del numero di open {
. Ad esempio (questo è in realtà un one-liner, puoi copiare / incollare direttamente nel tuo terminale, l'ho appena espanso per chiarezza):
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
Infine, se le soluzioni funzionano come previsto, è possibile aggiungere il -i
flag e apportare le modifiche al file stesso:
perl -i -pe 'if(/location\s*\/static/){$n=1}elsif(/}/){$n=0} s/^/#/ if $n==1;' file