Na verdade, é bem simples com sed
: se uma linha corresponder, basta copiá-la para o espaço h
old e, em seguida, s
ubstitute o valor.
Na linha $
t e x
change armazena espaço e espaço padrão, então verifique se o último está vazio. Se não estiver vazio, significa que a substituição já foi feita, então nada a fazer. Se estiver vazio, significa que nenhuma correspondência foi encontrada, então substitua o espaço padrão pela variável = valor e acrescente à linha atual no buffer de armazenamento. Finalmente, e x
muda novamente:
sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
A descrição acima é de gnu sed
syntax. Portátil:
sed '/^FOOBAR=/{
h
s/=.*/=newvalue/
}
${
x
/^$/{
s//FOOBAR=newvalue/
H
}
x
}' infile