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

相關內容