sed adiciona uma linha após a correspondência que contém uma nova linha

sed adiciona uma linha após a correspondência que contém uma nova linha

Eu tenho o seguinte bloco.

  location /api {
    proxy_pass http://localhost:8080;
  }

  location /oauth2 {
    proxy_pass http://localhost:8080;
  }

  location /login {
    proxy_pass http://localhost:8080;
  }

Quero adicionar uma nova linha após proxy_pass, mas apenas na seção/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;
  }

Estou tendo dificuldade em acertar o regex.

Tentativas semi-sucedidas:

sed -re '/[[:space:]]proxy_pass http:\/\/localhost:8080;/a\    proxy_read_timeout 300;' nginx.con

^^^ Isso adiciona read_timeout a cada linha contendo a diretiva proxy_pass, obviamente, então tentei adicionar variações de \r ou \n ou \r\n ou [[:space:]]+ ao início - sem sorte.

Tentei seguir o outro caminho com algo como:

sed '/location \/api {\n\s+proxy_pass.*/a            proxy_read_timeout 300' nginx.conf

mas falhando lá também

Alguém pode dar uma dica útil?

Responder1

Desafio aceito.

Experimente este comando:

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

As palavras-chave mágicas são:

  • o 'N' no início da sua solicitação sed, que informa ao sed para corresponder a várias linhas.
  • o '/a' que diz ao sed para adicionar uma nova linha após a sua partida.

Além disso, adicione espaços adequados para corresponder ao seu recuo :)

EDIT: Segunda sugestão.

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

informação relacionada