sed добавляет строку после совпадения, которая содержит новую строку

Вопрос или проблема

У меня есть следующий блок.

  location /api {
    proxy_pass http://localhost:8080;
  }

  location /oauth2 {
    proxy_pass http://localhost:8080;
  }

  location /login {
    proxy_pass http://localhost:8080;
  }

Я хочу добавить новую строку после proxy_pass, но только в разделе /api:

  location /api {
    proxy_pass http://localhost:8080;
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
  }

  location /oauth2 {
    proxy_pass http://localhost:8080;
  }

  location /login {
    proxy_pass http://localhost:8080;
  }

Мне тяжело правильно настроить регулярное выражение.

Полууспешные попытки:

sed -re '/[[:space:]]proxy_pass http:\/\/localhost:8080;/a\    proxy_read_timeout 300;' nginx.con

^^^ Это добавляет read_timeout к каждой строке, содержащей директиву proxy_pass, очевидно, поэтому я пытался добавить вариации \r или \n или \r\n или [[:space:]]+ в начале – безуспешно.

Пытался пойти другим путем с чем-то вроде:

sed '/location \/api {\n\s+proxy_pass.*/a            proxy_read_timeout 300' nginx.conf

но там тоже не удалось

Может кто-нибудь подсказать полезный совет?

Вызов принят.

Попробуйте эту команду:

sed 'N;/location \/api.*proxy_pass http:\/\/localhost:8080;/a \    proxy_read_timeout 300;\n    proxy_connect_timeout 300;\n    proxy_send_timeout 300;\n' nginx.conf

Волшебные ключевые слова:

  • ‘N’ в начале вашего запроса sed, который говорит sed сопоставлять несколько строк.
  • ‘/a’, который говорит sed добавить новую строку после вашего соответствия.

И кроме того, добавление правильных пробелов для соответствия вашей индентации 🙂

ИЗМЕНЕНИЕ: Второе предложение.

sed 'N;/location \/api.*proxy.*$/a \    proxy_read_timeout 300;\n    proxy_connect_timeout 300;\n    proxy_send_timeout 300;\n' nginx

Ответ или решение

Для решения задачи добавления новых строк после директивы proxy_pass исключительно в секции location /api в файле nginx.conf, необходимо использовать команду sed с учетом особенностей работы с многострочными шаблонами. Следует обратить внимание на синтаксис и использование регулярных выражений, чтобы корректно задать нужные условия.

Решение с использованием sed

Предлагаю следующую команду sed, которая позволяет корректно добавить необходимые строки с тайм-аутами:

sed '/location \/api/,/}/ {
    /proxy_pass http:\/\/localhost:8080;/a \
    proxy_read_timeout 300; \
    proxy_connect_timeout 300; \
    proxy_send_timeout 300;
}' nginx.conf

Объяснение команды

  1. Определение диапазона: /location \/api/,/}/ – этот фрагмент указывает sed на работу с блоком, начинающимся с location /api и заканчивающимся закрывающей фигурной скобкой }. Это гарантирует, что все операции будут проходить только в пределах этого блока.

  2. Поиск строки: /proxy_pass http:\/\/localhost:8080;/ – здесь мы ищем строку с директивой proxy_pass, чтобы убедиться, что мы находимся именно в нужном месте.

  3. Добавление строк: a \ ... – это команда добавления. После найденной строки proxy_pass добавляются три новых строки с таймаутами. Каждый новый элемент следует указывать на новой строке, с обязательным добавлением символа \ для продолжения команды на следующую строку.

Запуск команды

Для выполнения команды сохраните изменения в новом файле, чтобы не потерять оригинал:

sed '/location \/api/,/}/ {
    /proxy_pass http:\/\/localhost:8080;/a \
    proxy_read_timeout 300; \
    proxy_connect_timeout 300; \
    proxy_send_timeout 300;
}' nginx.conf > nginx_updated.conf

Теперь в nginx_updated.conf будут содержаться все оригинальные данные, включая новые директивы таймаута только в блоке location /api.

Подводя итоги

Данный способ позволяет избежать внесения изменений в другие секции конфигурационного файла, сохраняя целостность и корректность конфигурации. Регулярные выражения в сочетании с возможностями sed дают мощный инструментарий для манипуляции текстом и изменения конфигурационных файлов. Важно тщательно тестировать изменения, чтобы гарантировать правильную работу вашего веб-сервера после внесения изменений.

Оцените материал
Добавить комментарий

Капча загружается...