У меня есть скрипт bash для установки веб-сервера на моем сервере Ubuntu.
Я хотел бы в /etc/apache2/apache2.conf заменить
#ServerRoot "/etc/apache2"
#
на
#ServerRoot "/etc/apache2"
ServerName localhost
#
, если я сделаю
sed -i 's|#ServerRoot "/etc/apache2"|#ServerRoot "/etc/apache2"\nServerName localhost|' /etc/apache2/apache2.conf
это работает, но я бы хотел включить пустую строку и # после #ServerRoot, чтобы избежать добавления дважды ServerName, если скрипт выполняется дважды.
Я пытался
sed -i 's|#ServerRoot "/etc/apache2"\n\n#|#ServerRoot "/etc/apache2"\nServerName localhost\n\n#|' /etc/apache2/apache2.conf
Но это не работает.
Как насчет
#ServerRoot "/etc/apache2"
ServerName localhost
для этогоСоединение этого,
sed -i '\|#ServerRoot "/etc/apache2"| {N;s|\n$|\nServerName localhost|}' /etc/apache2/apache2.conf
В случае, если 'пустая' строка на самом деле содержит пробел, Вы могли изменить это к
sed -i '\|#ServerRoot "/etc/apache2"| {N;s|\n\s*$|\nServerName localhost|}' /etc/apache2/apache2.conf
Иначе (благодарит muru), но немного из контекста, потому что не использование sed:
Для Ubuntu 14.04:
Создают файл fqdn.conf dans /etc/apache2/conf-available / содержащий
ServerName localhost
, Создают символьную ссылку в/etc/apache2/conf-enabled /
sudo ln -s /etc/apache2/conf-available/fqdn.conf /etc/apache2/conf-enabled/fqdn.conf
Наконец получил двойное -\n
регистрация работы sed
со справкой от этого. Бит полного рта:
sed -Ei ':a;N;$!ba;s/^(#ServerRoot[^\n]*)\n\n/\1\nServerName localhost\n\n/' apache2.conf
И awk, который делает то же (дольше, но легче понять IMO). Логика и sponge
объяснены в последнем разделе.
awk '{print}/^#ServerRoot/{getline; if($0=="") print "ServerName localhost"; print}' apache2.conf | sponge apache2.conf
Править: sed
не так твердо, как я первоначально думал, что это было. Вы просто хотите соответствовать и добавить ( a
команда); Вы не должны заменять. Я протестировал следующее как работу:
sed -i '/^#ServerRoot/a ServerName localhost' apache2.conf
Можно быть более конкретными с соответствием, при необходимости и я уеду awk
ниже для пользы потомства.
Редактирование довольно тривиально с awk
но для обратной записи в тот же файл, нам или нужен временный посреднический файл или sponge
(от moreutils
пакет). Я покажу оба метода.
awk '{print}/^#ServerRoot/{print "ServerName localhost"}' apache2.conf > tmp
mv tmp apache2.conf
Или
awk '{print}/^#ServerRoot/{print "ServerName localhost"}' apache2.conf | sponge apache2.conf
awk
просто печатает каждую строку, которой это находит, но в случае достойного ^#ServerName
затем записи Ваша строка ServerName. Я нахожу этот вид обработки намного легче читать, чем произвольный "свопинг" с sed.