#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
.
- Создание файла исправления:
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" /> - ---> (...)
- Затем просто примените исправление:
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"
, а затем печатает комментарий / без комментариев.