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

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

но и там терпит неудачу

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

решение1

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

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

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 о необходимости добавить новую строку после совпадения.

И более того, добавляйте правильные пробелы, соответствующие отступам :)

EDIT: Второе предложение.

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

Связанный контент