我有以下块。
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
神奇的关键字是:
- sed 请求开头的“N”,它告诉 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