Cara terbaik tergantung pada apakah Anda mengharapkan file juga dimodifikasi oleh manusia, seberapa kompleks file itu, dan apakah Anda ingin skrip Anda diutamakan jika terlihat seperti orang lain menginginkan nilai yang berbeda. Artinya, jika file sudah berisi DBPassword=swordfish
, apakah Anda ingin menyimpannya, atau menggantinya dengan DBPassword=password
?
Cara yang umum untuk menangani ini adalah memiliki bagian file yang dibatasi oleh "komentar ajaib", dan hanya mengedit bagian di antara komentar ini. Inilah cara untuk melakukan ini dengan awk. Jika komentar ajaib tidak ada, bagian baru ditambahkan di akhir file. Peringatan: kode yang belum diuji.
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
Pendekatan ini tidak berfungsi dengan baik jika program yang membaca file konfigurasi tidak mendukung banyak baris pengaturan item konfigurasi yang sama. Dalam hal ini, Anda benar-benar harus menghapus yang lama. Dalam hal ini saya akan menyarankan agar komentar tidak tersentuh dan menambahkan pengaturan Anda sendiri di akhir.
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