En iyi yol, dosyanın insanlar tarafından da değiştirilmesini bekleyip beklememenize, dosyanın ne kadar karmaşık olduğuna ve birisinin farklı bir değer istemesi durumunda komut dosyanızın öncelik kazanmasını isteyip istemediğinize bağlıdır. Yani, dosya zaten içeriyorsa DBPassword=swordfish
, bunu tutmak DBPassword=password
mı yoksa değiştirmek mi istersiniz?
Bununla başa çıkmanın yaygın bir yolu, dosyanın "sihirli yorumlar" ile ayrılmış bir bölümüne sahip olmak ve yalnızca bu yorumlar arasındaki kısmı düzenlemektir. İşte bunu awk ile yapmanın bir yolu. Sihirli yorumlar yoksa, dosyanın sonuna yeni bölüm eklenir. Uyarı: denenmemiş kod.
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
Yapılandırma dosyasını okuyan program aynı yapılandırma öğesini ayarlayan birden fazla satırı desteklemiyorsa bu yaklaşım işe yaramaz. Bu durumda, eskilerini kaldırmanız gerekir. Bu durumda yorumları el değmeden bırakmanızı ve sonunda kendi ayarlarınızı eklemenizi tavsiye ederim.
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