Edite várias linhas de uma certa seção de um arquivo INI

3

Eu tenho o arquivo de configuração do subversion ( ~/.subversion/servers )

Eu preciso modificar para adicionar informações de proxy (host, porta, exceções). Este arquivo contém muitas seções com informações de proxy. Eu só quero modificar [global] .

Eu já criei uma expressão regular para isso, mas não funciona.

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

Você pode testar on-line com o link e ele funciona muito bem substituindo:

http-proxy-port=9000

Eu tento com sed executando a linha acima e sem palavra.

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

Como posso fazer o sed funcionar com o regex acima?

Este arquivo de subversão de amostra:

### 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

A saída 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
    
por ccolina 17.12.2016 / 16:40

1 resposta

2

Como sugerido, existem maneiras melhores de editar arquivos INI ...
Ainda assim, aqui está uma maneira com 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

Isso substitui o buffer de retenção pelo conteúdo do espaço de padrões sempre que encontrar uma linha correspondente a [.*] (ou seja, salva cada nome de seção no buffer h old). Em cada linha que corresponda aos seus padrões http-.* , ele e x alterará os buffers - se o espaço em espera não ( ! ) corresponder a [global] , então e x será alterado novamente e ignorará para o próximo ciclo via b . Se o espaço de espera corresponder a [global] it e x for alterado novamente, c trará o conteúdo do espaço de padrão.

    
por 13.04.2017 / 14:36