Sed consegue lidar com isso com bastante facilidade. É um único comando "substituto", prefixado com um intervalo de endereços. Eu adicionei espaçamento extra para melhor legibilidade:
sed -e '/^\[ABC\]$/ , /^\[.*\]$/ s/^\(value1=\).*$/notbla/'
Sem o espaçamento extra, é:
sed -e '/^\[ABC\]$/,/^\[.*\]$/s/^\(value1=\).*$/notbla/'
Você realmente não precisa de expressões regulares ancoradas, mas elas podem ser mais seguras em alguns casos de entradas incomuns. Uma versão ligeiramente mais curta com expressões regulares sem âncora é:
sed -e '/\[ABC\]/,/^\[/s/^\(value1=\).*$/notbla/'
Explicação:
Você pediu que cada bandeira ou opção fosse explicada, e eu tenho tempo, então aqui vai você. Estou explicando a versão final (mais curta) dos três comandos Sed listados acima.
A primeira parte da linha é um intervalo de endereços: /startregex/,/stopregex/ O comando s ubstitute, que segue o intervalo de endereços, é aplicado apenas às linhas de startregex a stopregex (inclusive).
Nesse caso, a regex inicial é /\[ABC\]/ . Os colchetes são normalmente caracteres especiais dentro de uma expressão regular, por isso colocamos uma barra invertida antes de cada um para indicar caracteres literais de colchetes literais.
A regex de parada é /^\[/ , que usa o caractere de regex especial ^ para indicar o início de uma linha. Esse padrão corresponderá a qualquer linha que comece com um colchete esquerdo literal ( [ ).
O comando s ubstitute é basicamente bastante simples; o formato geral é s/findregex/replacetext/ . Ele também pode ter sinalizadores especiais colocados após o / final para modificar seu comportamento, mas não estou usando nenhum desses sinalizadores aqui.
A "regex encontrada" é ^\(value1=\).*$ .
O cursor ( ^ ) corresponde ao início da linha, como mencionado anteriormente, e o sinal de dólar ( $ ) corresponde ao final da linha. Portanto, todo esse padrão deve corresponder a uma linha inteira, não apenas parte de uma.
Os parênteses ( () ), ao contrário dos colchetes, são non -especiais por padrão nas expressões regulares, então colocamos as barras invertidas antes deles para dar a eles um significado especial. Eles permitem que partes do texto correspondente (o texto correspondido pelo "find regex") sejam usadas no texto de substituição. Especificamente, o no texto de substituição significa "O texto correspondido no primeiro conjunto de parênteses na expressão regular". Neste caso, isso é sempre apenas "valor1=".
O elemento final no "find regex" é .* . O ponto ( . ) significa "qualquer caractere único" e o asterisco ( * ) significa "qualquer número de vezes (zero ou mais)". Então, a estrela do ponto ( .* ) corresponde ao resto inteiro da linha, após o sinal de igual.
"notbla" no texto de substituição é apenas texto estático, nada de especial.
Para realmente aprender Sed corretamente, eu recomendo o tutorial do Grymoire Sed , que é gratuito on-line.