Bash

通過 bash 腳本編輯配置文件

  • June 3, 2013

我一直在嘗試編寫一個簡單的 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

引用自:https://unix.stackexchange.com/questions/78071