Изменить tomcat server.xml настройка с использованием sed

#regex #linux #bash #tomcat #sed

#регулярное выражение #linux #bash #tomcat #sed

Вопрос:

Я создаю пакет Ubuntu, который зависит от Tomcat7 через HTTPS. Чтобы сделать это удобным для наших клиентов, я бы хотел, чтобы сценарий установки пакета включал HTTPS в Tomcat7. Это довольно легко сделать вручную; в файле /etc/tomcat7/server.xml , нужно раскомментировать следующий блок:

 <!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
-->
 

Как я мог бы сделать это из shellscript? Предпочтительно таким образом, чтобы он все еще работал для небольших изменений точного шаблона. Я думаю, что правило было бы чем-то вроде search for '<Connector port="8443"' , а затем удалить <!-- и --> до и после блока.

Ответ №1:

Рассмотрите возможность применения исправления на вашем server.xml .

  1. Создание файла исправления:
     diff -ruN server.xml.old server.xml.new > mydiff.patch
     

    Где server.xml.old находится исходный файл, и server.xml.new является ли файл таким, каким вы хотите.

    Исправление ( mydiff.patch ) будет выглядеть следующим образом:

     --- server.xml.old  2011-10-29 04:03:25.000000000 -0300
        server.xml.new 2011-10-29 04:04:03.000000000 -0300
    @@ -1,10  1,10 @@
     (...)
    
    - <!--
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                maxThreads="150" scheme="https" secure="true"
                clientAuth="false" sslProtocol="TLS" />
    - --->
    
     (...)
     
  2. Затем просто примените исправление:
      patch server.xml mydiff.patch
     

    Вы можете запустить patch команду с флагом -N . Таким образом, он будет пропускать файлы, которые кажутся уже исправленными.

Комментарии:

1. Спасибо. Что произойдет, если я попытаюсь применить исправление, но исправление уже было применено? Например. системный администратор уже включил этот соединитель перед установкой моего пакета?

2. Вы можете запустить patch с флагом -N . Таким образом, он будет удалять файлы, которые, похоже, уже исправлены.

3. Для шага 2, разве это не «исправление server.xml < mydiff.patch» ?

Ответ №2:

diff, скорее всего, должен быть выбранным вами инструментом. Но если исходный файл конфигурации часто меняется, diff не сможет применить ваш скрипт в будущих версиях.

sed также имеет возможность чтения более чем в одной строке. Возможно, вы захотите взглянуть на этот пример, который также касается изменения XML-документа.

Ответ №3:

Это может сработать:

  sed -nr '/^<!--/,/^-->/!{p;b};/^<!--/{h;d};H;/^-->/{x;/<Connector port="8443"/{s/(^<!--s*n|ns*-->)//g};p}'
 

При этом игнорируются все строки без комментариев. Сохраняет строки комментариев в пространстве удержания, затем удаляет разделители начального / конечного комментария, если комментарий содержит <Connector port="8443" , а затем печатает комментарий / без комментариев.