Bash
通過 bash 腳本編輯配置文件
我一直在嘗試編寫一個簡單的 bash 腳本,我將使用它來安裝應用程序並更新它的配置文件。我很難修改它的配置文件。
# DBHost=localhost DBName=test # DBPassword=
任何建議我可以如何修改如下?
DBHost=localhost DBName=database DBPassword=password
最好的方法取決於您是否希望文件也被人修改,文件的複雜程度,以及如果看起來其他人想要不同的值,您是否希望腳本優先。也就是說,如果文件已經包含
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