sed agrega una línea después de la coincidencia que contiene una nueva línea

sed agrega una línea después de la coincidencia que contiene una nueva línea

Tengo el siguiente bloque.

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

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

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

Quiero agregar una nueva línea después de proxy_pass pero solo en la sección /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;
  }

Me está costando mucho conseguir la expresión regular correcta.

Intentos semi exitosos:

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

^^^ Obviamente, esto agrega read_timeout a cada línea que contiene la directiva proxy_pass, así que intenté agregar variaciones de \r o \n o \r\n o [[:space:]]+ al principio, sin suerte.

He intentado ir al revés con algo como:

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

pero fallando ahí también

¿Alguien puede darnos un consejo útil?

Respuesta1

Desafío aceptado.

Pruebe 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

Las palabras clave mágicas son:

  • la 'N' al comienzo de su solicitud sed, que le indica a sed que coincida con varias líneas.
  • el '/a' que le dice a sed que agregue una nueva línea después de su coincidencia.

Y además agregar espacios adecuados para que coincidan con su sangría :)

EDITAR: Segunda sugerencia.

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

información relacionada