это не тривиально. Если можно считать, что каждый {}
блок не содержит других вложенных {}
блоки легче и вы можете сделать что-то вроде этого:
perl -pe 'if(/location\s*\/static/){$n=1}elsif(/}/){$n=0} s/^/#/ if $n==1;' file
это просто наборы $n
to 1
если текущая строка соответствует location /static
и устанавливает его обратно к 0
в первом }
после location/static
. Затем, пока $n==1
, это addas a #
к началу строки. The -p
флаг причиняет perl автоматически закрепить петлей через введите файл и распечатайте каждую строку.
теперь, если вы можете иметь произвольную глубину вложенных блоков в блоках, которые вы хотите прокомментировать, все становится сложнее. Например, если у вас есть что-то вроде этого:
location /static {
if(foo){
print "one";
}
elsif(bar){
print "two";
}
}
для подобных случаев, простое решение выше потерпит неудачу, и вам придется использовать тот, который отслеживает количество открытых {
. Например (это на самом деле однострочный, вы можете скопировать / вставить прямо в свой терминал, я просто расширил его для clarity):
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
наконец, если решения работают должным образом, вы можете добавить -i
флаг сделайте изменения в самом файле:
perl -i -pe 'if(/location\s*\/static/){$n=1}elsif(/}/){$n=0} s/^/#/ if $n==1;' file