วิธีที่ดีที่สุดขึ้นอยู่กับว่าคุณคาดหวังว่าไฟล์จะถูกแก้ไขโดยมนุษย์ความซับซ้อนของไฟล์และว่าคุณต้องการให้สคริปต์ของคุณมีความสำคัญถ้าดูเหมือนว่าคนอื่นต้องการค่าที่แตกต่างกัน นั่นคือหากไฟล์มีอยู่แล้วDBPassword=swordfish
คุณต้องการเก็บไว้หรือแทนที่ด้วยDBPassword=password
หรือไม่
วิธีทั่วไปในการจัดการกับสิ่งนี้คือการมีส่วนของไฟล์ที่คั่นด้วย "ความคิดเห็นเวทย์มนตร์" และแก้ไขเฉพาะส่วนระหว่างความคิดเห็นเหล่านี้ นี่คือวิธีการทำกับ awk หากไม่มีความคิดเห็นเวทมนต์ส่วนใหม่จะถูกเพิ่มที่ท้ายไฟล์ คำเตือน: รหัสที่ยังไม่ทดลอง
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
วิธีการนี้ใช้ไม่ได้ผลหากโปรแกรมที่อ่านไฟล์กำหนดค่าไม่รองรับหลายบรรทัดที่ตั้งค่ารายการเดียวกัน ในกรณีนี้คุณจะต้องลบไฟล์เก่าออก ในกรณีนี้ฉันจะแนะนำให้ทิ้งความคิดเห็นไว้โดยไม่แตะต้องและเพิ่มการตั้งค่าของคุณเองในตอนท้าย
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