Edite varias líneas de una determinada sección de un archivo INI

Edite varias líneas de una determinada sección de un archivo INI

Tengo el archivo de configuración de subversion ( ~/.subversion/servers)

Necesito modificar para agregar información de proxy (host, puerto, excepciones). Este archivo contiene muchas secciones con información de proxy. solo quiero modificar[global].

Ya creé una expresión regular para esto pero no funciona.

/(\[global\].*[\n])((.*[\n])*)([\s\#]*http-proxy-port\s?=\s?.*)/gm

Puedes probar la prueba en línea conhttps://regex101.com/y funciona muy bien reemplazando con:

\1\2http-proxy-port=9000

Intento sedejecutar la línea de arriba y no hay palabra.

sed -i -r 's/(\[global].*[\n])((.*[\n])*)([\s\#]*http-proxy-port\s?=\s?.*)/\1\2http-proxy-port=9000/gm' \
 ~/.subversion/servers

¿Cómo puedo hacer sedque funcione con la expresión regular anterior?

Este archivo de subversión de muestra:

### The currently defined server options are:
###   http-proxy-host            Proxy host for HTTP connection
###   http-proxy-port            Port number of proxy host service
###   http-proxy-username        Username for auth to proxy service
###   http-proxy-password        Password for auth to proxy service
###   http-proxy-exceptions      List of sites that do not use proxy
###   http-timeout               Timeout for HTTP requests in seconds

[groups]
# group1 = *.collab.net
# othergroup = repository.blarggitywhoomph.com
# thirdgroup = *.example.com

### Information for the first group:
# [group1]
# http-proxy-host = proxy1.some-domain-name.com
# http-proxy-port = 80
# http-proxy-username = blah
# http-proxy-password = doubleblah
# http-timeout = 60

### Information for the second group:
# [othergroup]
# http-proxy-host = proxy2.some-domain-name.com
# http-proxy-port = 9000

### SSL certificate.  See details above for overriding security
### due to SSL.
[global]
# http-proxy-exceptions = *.domain.org, *.domain.com
# http-proxy-host = proxy.domain.com
# http-proxy-port = 8080
# http-proxy-username = defaultusername
# http-proxy-password = defaultpassword

La producción esperada será

...
[global]
http-proxy-exceptions = *.otherdomain.org, *.otherdomain.com, 127.0.0.1, localhost
http-proxy-host = proxy.otherdomain.com
http-proxy-port = 9000
# http-proxy-username = defaultusername
# http-proxy-password = defaultpassword

Respuesta1

Como se sugiere,hay mejores formas de editar archivos INI...
Aún así, aquí hay una forma con sed:

sed '/^\[.*\]/h
/http-proxy-exceptions/{x;/\[global\]/!{x;b;};x;c\
http-proxy-exceptions = *.otherdomain.org, *.otherdomain.com, 127.0.0.1, localhost
}
/http-proxy-host/{x;/\[global\]/!{x;b;};x;c\
http-proxy-host = proxy.otherdomain.com
}
/http-proxy-port/{x;/\[global\]/!{x;b;};x;c\
http-proxy-port = 9000
}' infile

Esto sobrescribe el búfer de retención con el contenido del espacio de patrón cada vez que encuentra una línea coincidente [.*](es decir, guarda cada nombre de sección en el hbúfer antiguo). En cada línea que coincida con sus http-.*patrones, xcambiará los buffers (si el espacio de retención no lo hace).no( !) coincide [global], luego vuelve xa cambiar y salta al siguiente ciclo mediante b. Si el espacio de retención coincide, [global]vuelve xa cambiar y ccuelga el contenido del espacio del patrón.

información relacionada