
У меня есть следующий блок.
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