регулярное выражение (небольшой скрипт)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

регулярное выражение

Сообщение bars »

Привет.
Подскажите пожалуйста, как лучше сделать редактирования кучу vhost на сервере nginx?
Есть много однотипных виртуалхостов, в них я хочу убрать один блок server.
Этот блок убрать или закоментировать:

Код: Выделить всё

server {
listen 1.1.1.1:443 http2 ssl;
server_name www.test.mydom.biz;
return 301 https://dev.mydom.biz$request_uri;
ssl_certificate /etc/letsencrypt/live/test.mydom.biz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.mydom.biz/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/test.mydom.biz/cert.pem;
include inc_conf/ssl_conf;
}
Полный вид vhosts.

Код: Выделить всё

server {
listen 1.1.1.1:80;
server_name www.test.mydom.biz test.mydom.biz;
location /.well-known/acme-challenge/ {
root /www/dir;
}
location / {
return 301 https://dev.mydom.biz$request_uri;
}
}

server {
listen 1.1.1.1:443 http2 ssl;
server_name www.test.mydom.biz;
return 301 https://dev.mydom.biz$request_uri;
ssl_certificate /etc/letsencrypt/live/test.mydom.biz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.mydom.biz/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/test.mydom.biz/cert.pem;
include inc_conf/ssl_conf;
}

server {
listen 1.1.1.1:443 http2 ssl;
server_name test.mydom.biz;
return 301 https://dev.mydom.biz$request_uri;
ssl_certificate /etc/letsencrypt/live/test.mydom.biz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.mydom.biz/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/test.mydom.biz/cert.pem;
include inc_conf/ssl_conf;
root /www/test.mydom.local/;

include inc_conf/lock_bots;
include /etc/nginx/redir_test_local;
}
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

Re: регулярное выражение

Сообщение bars »

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

Код: Выделить всё

awk '/server/,/ssl_conf;\n}/ /etc/nginx/vhosts/ddd
или так 
sed -n '/^server/,/ssl_conf;\n}$/p' /etc/nginx/vhosts/ddd
Что то ни как не получается.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: регулярное выражение

Сообщение Bizdelnick »

Такие вещи проще делать не регулярками, а augtool. Правда, некоторое время на его изучение придётся потратить.
Что касается awk и sed, Вы забыли, что они работают построчно. Регулярка, содержащая перевод строки, просто так ни с чем не совпадёт.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

Re: регулярное выражение

Сообщение bars »

печально
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1380
ОС: Slackware

Re: регулярное выражение

Сообщение UnixNoob »

Возможно сценарий vim можно было бы создать, но я на столько хорошо его не знаю.
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

Re: регулярное выражение

Сообщение bars »

В куче виртуал-хостов, структура такая: есть 3 блока server, разумеется данные в этих блоках в настройках виртуал-хостов разные.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: регулярное выражение

Сообщение Bizdelnick »

Bizdelnick писал:
05.04.2023 18:32
augtool
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

Re: регулярное выражение

Сообщение bars »

Bizdelnick писал:
06.04.2023 01:54
Bizdelnick писал:
05.04.2023 18:32
augtool
:blush:
Что то лениво изучать.
А если сделать так.
Поиск по первому совпадению include inc_conf/ssl_conf; тут удалить символы переноса строки и т.д.
Получится include inc_conf/ssl_conf;} и после уже по этому маркеру можно будет определить нужный блок.
Пробую так, но что то без успешно.

Код: Выделить всё

sed '0,/ssl_conf;[[:space:]]/s/ssl_conf;[[:space:]]/ssl_conf;/' vhost.conf
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: регулярное выражение

Сообщение olecya »

bars
Это FreeBSD или линух?
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

Re: регулярное выражение

Сообщение bars »

olecya писала:
06.04.2023 09:25
Это FreeBSD или линух?
Интересно для обоих систем.
Не пойму как определить символ перевода строки после ssl_conf;.
Последний раз редактировалось bars 06.04.2023 09:27, всего редактировалось 1 раз.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: регулярное выражение

Сообщение /dev/random »

bars писал:
06.04.2023 08:29
тут удалить символы переноса строки и т.д.
sed по умолчанию работает построчно. Просто так удалить перевод строки не получится. В буфере для редактирования находится одна строка, без переводов. Чтобы считать следующую строку и приписать её к буферу (отделив переводом строки), используется команда N.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

Re: регулярное выражение

Сообщение bars »

/dev/random писал:
06.04.2023 09:27
sed по умолчанию работает построчно. Просто так удалить перевод строки не получится. В буфере для редактирования находится одна строка, без переводов. Чтобы считать следующую строку и приписать её к буферу (отделив переводом строки), используется команда N.
Спасибо за совет.
Получилось.

Код: Выделить всё

sed 'N;0,/ssl_conf;\n/s/ssl_conf;\n/ssl_conf;/' /etc/nginx/vhost.conf
...
...
...
ssl_trusted_certificate /etc/letsencrypt/live/test.mydom.biz/cert.pem;
include inc_conf/ssl_conf;}
...
...
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: регулярное выражение

Сообщение /dev/random »

bars писал:
06.04.2023 09:33
sed 'N;0,/ssl_conf;\n/s/ssl_conf;\n/ssl_conf;/' /etc/nginx/vhost.conf
Осторожно, этот sed-скрипт чувствителен к чётным-нечётным строкам. Добавьте ещё одну строку в начало вашего файла, и команда не сработает.

sed работает так: считывает одну строку в буфер, выполняет sed-скрипт, выводит и очищает буфер, считывает новую строку, выполняет скрипт повторно, и т.д.

Ваш скрипт будет работать так: считали строку 1, увидели команду N и считали строку 2, выполнили условный "s" для строк 1+2, вывели и очистили буфер, считали строку 3, увидели команду N и считали строку 4, выполнили условный "s" для 3+4 (но не 2+3!) и т.д.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: регулярное выражение

Сообщение olecya »

Вот посмотрите, всеядный и для линух и для FreeBSD (Знак комментария решетка):

Код: Выделить всё

awk '/ssl_conf;\n$/ {gsub(/\n/, "\n#")}1' RS='}' ORS='}' file
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

Re: регулярное выражение

Сообщение bars »

olecya писала:
06.04.2023 10:00
awk '/ssl_conf;\n$/ {gsub(/\n/, "\n#")}1' RS='}' ORS='}' file
Спасибо работает, проверил на линуксе.
А что означает это "\n#"?
Добавлено (10:08):
Как я понимаю это просто в пустую строку добавить символ #
}
#
#server {
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: регулярное выражение

Сообщение olecya »

bars писал:
06.04.2023 10:04
А что означает это "\n#"?
Мы разбиваем записи в файле не по концу строки, а по фигурной обратной скобке. И в нужном блоке заменяем каждый символ перевода строки на тот же символ и решетку. Так что можно сократить программу на один символ:

Код: Выделить всё

gsub(/\n/, "&#")
:)
Добавлено (10:22):
Поправочка. Если в списке этот блок будет первым, первая строчка не закомментируется. Патч:

Код: Выделить всё

gsub(/(^|\n)/, "&#")
Добавлено (10:42):
Вот для линуха вариант еще на sed:

Код: Выделить всё

sed '/^server {/!b;:1;N;/^}$/M!b1;/ssl_conf;\n}/s/^/#/mg' file
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: регулярное выражение

Сообщение Bizdelnick »

bars писал:
06.04.2023 08:29
Что то лениво изучать.
Это намного проще, чем нечитаемые заклинания sed/awk, в которых ещё и очень легко напортачить, если чего-то не учесть. Сам это проходил.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 935
ОС: BSD/LINUX
Контактная информация:

Re: регулярное выражение

Сообщение bars »

Bizdelnick писал:
06.04.2023 12:52
чем нечитаемые заклинания sed/awk,
:D :wacko: :laugh:
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: регулярное выражение

Сообщение olecya »

Bizdelnick
olecya писала:
06.04.2023 10:11
Вот для линуха вариант еще на sed:
Исправила:
Вот для линуха еще вариант заклинания на sed (Осторожно! Пойдет дождь!):

Код: Выделить всё

sed '/^server {/!b;:1;N;/^}$/M!b1;/ssl_conf;\n}/s/^/#/mg' file
Ну что есть, то есть, Я бы добавила еще сюда калькулятор dc - зависть всех колдунов на перле. Несмотря на то что заклинание довольно компактно здесь много моментов где можно заблудиться. Придется расшифровывать в познавательных целях:

/^server {/!b; - все строки начало которых не совпадают ! с шаблоном /^server {/ выводятся в обход дальнейшего скрипта. Команда b безусловного перехода переводит выполнение в самый конец скрипта если не указана метка, как в этом случае.
:1;N; - следовательно, строки начинающиеся с server { обрабатываются следующим скриптом и добавляют N следующую строку в буфер. Сейчас метка :1 игнорируется.
/^}$/M!b1; - если в буфере не находится ! строка с одним символом /^}$/ то выполняется переход по метке b1 и цикл с добавлением в буфер следующей строки и проверкой повторяется пока не обнаружится совпадение по шаблону /^}$/M. Модификатор M говорит регулярному выражению, что в буфере находятся больше одной строки и якоря начала строки ^ и конца строки $ должны быть применены не к буферу целиком, а к каждой строке составляющей буфер.
/ssl_conf;\n}/s/^/#/mg - как только в буфере обнаруживается шаблон } закрывающий блок кода, выполняется следующий участок скрипта - поиск совпадения по шаблону /ssl_conf;\n}/ в буфере и если совпадение есть выполняется подстановка в начале каждой строки знака комментария. Модификаторы mg в конце команды подстановки s/// говорят что строк в буфере больше одной m, а значит якорь ^ применяется к каждой строке в буфере и надо сделать подстановки во всех g совпадениях. Если совпадения нет выводится буфер без изменения, как есть.
Спасибо сказали:
Ответить