Поскольку файл конфигурации, вероятно, содержит гораздо больше, чем этот раздел, ложные совпадения - это проблема, которую следует рассмотреть здесь. В частности, соответствие ^#\s*}
и надежда на лучшее может привести к раскомментированию совершенно не связанных строк где-то еще в файле.
Из-за этого я собираю все строки, которые принадлежат данному разделу, прежде чем раскомментировать. Я думаю в соответствии с этим: поставить код
/^#\s*location ~ \\\.php\$ {/ {
:loop
/\n#\s*}/! {
N
b loop
}
s/^#//
s@#\(\s*include snippets/fastcgi-php\.conf;\)@\1@
s@#\(\s*fastcgi_pass unix:/var/run/php/php7\.\)0\(-fpm\.sock;\)@\11\2@
s/\n#\(\s*}\)/\n\1/
}
в файл, скажем uncomment.sed
, затем запустите
sed -f uncomment.sed /etc/nginx/sites-available/default
Если результат вас устраивает, добавьте параметр -i
для редактирования на месте.
Этот код работает следующим образом:
/^#\s*location ~ \\\.php\$ {/ { # starting with the first line of the section
# (regex taken from the question):
:loop # jump label for looping
/\n#\s*}/! { # Until the last line is in the pattern space
N # fetch the next line from input, append it
b loop # then loop
}
# At this point, we have the whole section in the pattern space.
# Time to remove the comments.
# There's a # at the beginning of the pattern space; remove it. This
# uncomments the first line.
s/^#//
# The middle two are taken from the question, except I'm using @ as
# a separator so I don't have to escape all those slashes and captures
# to avoid repeating myself.
s@#\(\s*include snippets/fastcgi-php\.conf;\)@\1@
s@#\(\s*fastcgi_pass unix:/var/run/php/php7\.\)0\(-fpm\.sock;\)@\11\2@
# Uncomment the last line. Note that we can't use ^ here because that
# refers to the start of the pattern space. However, because of the
# looping construct above, we know there's only one # directly after
# a newline followed by \s*} in it, and that's the comment sign before
# the last line. So remove that, and we're done.
s/\n#\(\s*}\)/\n\1/
}