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
-e
pesquisa 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,:a
define uma etiqueta chamadaa
,n
lê a próxima linha no espaço padrão e a imprime.ba
volta para o marcadora
. Isso tudo faz com quesed
imprima todas as linhas restantes intocadas. Agorased
sai com o comandoq
neste 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,a
adicionamDBName=localhost
à próxima linha. Observe que a nova linha aqui no comando é necessária, porque o comandoa
não deve ter nada depois em sua linha. Quando essa adição estiver concluída,:a;n;ba;q
fará o mesmo que na primeira expressão. Se não ... - ... a expressão terceiro é processada. Ele adiciona à última linha do arquivo (
$
) com o comandoa
a stringDBName=localhost
.