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:
-
/^\[/b
O regex
/^\[/
procura linhas que começam com[
. Para essas linhas, o comandob
é executado.b
significa 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
aaa
comNEW
.
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 [
.