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:
-
/^\[/bO regex
/^\[/procura linhas que começam com[. Para essas linhas, o comandobé executado.bsignifica branch e informa ao sed para passar (pular) o restante dos comandos. -
s/aaa/NEW/Para qualquer outra linha no intervalo, isso diz ao sed para substituir qualquer ocorrência de
aaacomNEW.
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 [ .