Это не тривиально. Если вы можете предположить, что каждый блок {} не содержит других, вложенных блоков {} это проще, и вы можете сделать что-то вроде этого:
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