Como alterar o valor de uma variável apenas em uma seção de um arquivo?

1

Estou procurando ajuda com um exemplo de uso do comando 'sed'. Eu quero mudar o valor da variável na seção no arquivo de texto, neste exemplo eu quero alterar o valor de aaa na seção [aaa] para o novo valor, como alterá-lo usando sed ou outro comando.

[aaa]
a= b 
c= aaa 
e = f 


[bbb]
a = b
c = aaa
e = f 
    
por J.dani 06.03.2018 / 07:56

2 respostas

1

Tente:

$ sed '/^\[aaa\]/,/^\[/{/^\[/b; s/aaa/NEW/}' file.ini
[aaa]
a= b 
c= NEW 
e = f 


[bbb]
a = b
c = aaa
e = f 

Como funciona

O comando geral parece

/^\[aaa\]/,/^\[/{...}

O par de duas expressões regulares separadas por uma vírgula, /^\[aaa\]/,/^\[/ define um intervalo de linhas iniciando com uma linha que começa com [aaa] e termina com a próxima linha que começa com [ . Para qualquer linha nesse intervalo, mas somente linhas nesse intervalo, os comandos em chaves são executados. Esses comandos são:

  1. /^\[/b

    O regex /^\[/ procura linhas que começam com [ . Para essas linhas, o comando b é executado. b significa branch e informa ao sed para passar (pular) o restante dos comandos.

  2. s/aaa/NEW/

    Para qualquer outra linha no intervalo, isso diz ao sed para substituir qualquer ocorrência de aaa com NEW .

Mais detalhadamente, /^\[aaa\]/ é um regex que é um literal [ no início de uma linha seguido por três a seguido por um literal ] . O [ e ] devem ter escape com uma barra invertida porque, sem a barra invertida, [ e ] são caracteres ativos regex. O regex /^\[ corresponde a qualquer linha que comece com [ , em que ^ é um caractere regex ativo que corresponde ao início de uma linha e \[ corresponde a um literal [ .

    
por John1024 06.03.2018 / 08:22
0

Eu sugeriria perl para isso - já que ele suporta a substituição no local (a opção -i ) e o modo de parágrafo , por exemplo.

$ perl -00pe 's/aaa/XYZ/g if /^\[aaa\]/' file.ini
[XYZ]
a= b 
c= XYZ 
e = f 

[bbb]
a = b
c = aaa
e = f 

Se você quiser substituir aaa na seção, mas não no cabeçalho da seção [aaa] , poderá excluir o último com lookarounds:

$ perl -00pe 's/(?<!\[)aaa(?!\])/XYZ/g if /^\[aaa\]/' file.ini
[aaa]
a= b 
c= XYZ 
e = f 

[bbb]
a = b
c = aaa
e = f 

Para realizar a substituição no local:

perl -i -00pe 's/(?<!\[)aaa(?!\])/XYZ/g if /^\[aaa\]/' file.ini
    
por steeldriver 06.03.2018 / 14:02