sed заменяет текст, содержащий новую строку

У меня есть скрипт 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

Но это не работает.

3
задан 3 July 2014 в 14:06

3 ответа

Как насчет

  1. поиск #ServerRoot "/etc/apache2"
  2. если найдено, считайте и добавьте следующую строку в пространство шаблона sed
  3. ищите добавленное пространство шаблона пустую строку после новой строки и замены 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
2
ответ дан 3 July 2014 в 14:06

Иначе (благодарит 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
0
ответ дан 3 July 2014 в 14:06

Наконец получил двойное -\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.

0
ответ дан 3 July 2014 в 14:06

Другие вопросы по тегам:

Похожие вопросы: