sed совпадает на одной строке и меняет другую - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу просмотреть файл (в данном случае это apache2.conf), выполнить поиск строки (), отмечающей начало раздела, и изменить другую строку (AllowOverride None на AllowOverride All) в этом разделе.

Строка, которую я хочу изменить, может быть, а может и не быть строкой рядом с началом раздела, но я хочу изменить только первый раз.

Вот пример из apache2.conf:

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>             <= this is the begining of the section
        Options Indexes FollowSymLinks
        AllowOverride None        <= this is the line I want to change
        Require all granted
</Directory>

#<Directory /srv/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>

С помощью друга я пришел к этому:

sed '/"<Directory \/var\/www\/>"/,$ {s/"AllowOverride None"/"AllowOverride All"/ }' apache2.conf

но дело в том, что это не работает.Я ожидал, что AllowOverride None будет AllowOverride All после прохождения sed.

Есть ли какое-нибудь решение?Что я делаю не так?

1 Ответ

0 голосов
/ 28 сентября 2018

Ваша команда sed довольно близка.Во-первых, вы не должны включать в него двойные кавычки:

sed '/<Directory \/var\/www\/>/,$ {
        s/AllowOverride None/AllowOverride All/
}' apache2.conf

Проблема теперь в том, что он также изменит AllowOverride None в последнем закомментированном разделе, и вы «только захотите изменить егопервый случай ".

Просто завершите свой блок при первом появлении" AllowOverride None ":

sed '/<Directory \/var\/www\/>/,/AllowOverride None/ {
        s/AllowOverride None/AllowOverride All/
}' apache2.conf
...