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

^^^ これにより、proxy_pass ディレクティブを含むすべての行に read_timeout が追加されるのは明らかです。そこで、先頭に \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 に指示します。

さらに、インデントに合わせて適切なスペースを追加します :)

編集: 2 番目の提案。

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

関連情報