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