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

神奇的关键字是:

  • 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

相关内容