A melhor maneira depende se você espera que o arquivo também seja modificado por humanos, quão complexo é o arquivo e se você deseja que seu script tenha precedência se parecer que alguém deseja um valor diferente. Ou seja, se o arquivo já contiver DBPassword=swordfish
, você deseja manter isso ou substituí-lo por DBPassword=password
?
Uma forma comum de lidar com isso é ter uma seção do arquivo delimitada por "comentários mágicos" e editar apenas a parte entre esses comentários. Aqui está uma maneira de fazer isso com o awk. Se os comentários mágicos não estiverem presentes, a nova seção será adicionada ao final do arquivo. Aviso: código não testado.
begin_marker='# BEGIN AUTOMATICALLY EDITED PART, DO NOT EDIT'
end_marker='# END AUTOMATICALLY EDITED PART'
new_section='DBHost=localhost
DBName=database
DBPassword=password'
export begin_marker end_marker
awk <file.conf >file.conf.new -v begin_marker="$begin_marker" -v begin_marker="$end_marker" -v new_section="$new_section" '
1 {print}
$0 == begin_marker && !changed {
do {getline} while ($0 != end_marker); # discard old section content
print new_section;
print;
changed = 1;
}
END {if (!changed) {print begin_marker; print new_section; print end_marker;}}
'
ln -f file.conf file.conf.old
mv -f file.conf.new file.conf
Essa abordagem não funciona bem se o programa que lê o arquivo de configuração não suportar várias linhas configurando o mesmo item de configuração. Nesse caso, você realmente precisará remover os antigos. Nesse caso, aconselho deixar os comentários intactos e adicionar suas próprias configurações no final.
grep -vE '^[[:blank:]]*(DBHost|DBName|DBPassword)=$' <file.conf >file.conf.new
cat <<EOF >>file.conf.new
DBHost=localhost
DBName=database
DBPassword=password
EOF
ln -f file.conf file.conf.old
mv -f file.conf.new file.conf