Use isto:
sed -e '/^DBName=.*/{s/^DBName=.*/DBName=localhost/;:a;n;ba;q}' \
-e '/^# DBName=.*/{a \DBName=localhost
:a;n;ba;q}' -e '$a \DBName=localhost' file
Onde:
- A instrução primeiro
-epesquisa por^DBName=.*(^significa desde o começo da linha) e, se for encontrada, a parte no{}brachets será executada: Isso irá procurar e substituir as strings e quando feito,:adefine uma etiqueta chamadaa,nlê a próxima linha no espaço padrão e a imprime.bavolta para o marcadora. Isso tudo faz com quesedimprima todas as linhas restantes intocadas. Agorasedsai com o comandoqneste momento e as outras expressões não serão processadas. Então, a substituição é feita apenas uma vez. - A expressão segunda procura por linhas que começam com
# DBName=.*e, se encontradas,aadicionamDBName=localhostà próxima linha. Observe que a nova linha aqui no comando é necessária, porque o comandoanão deve ter nada depois em sua linha. Quando essa adição estiver concluída,:a;n;ba;qfará o mesmo que na primeira expressão. Se não ... - ... a expressão terceiro é processada. Ele adiciona à última linha do arquivo (
$) com o comandoaa stringDBName=localhost.