最好的方法取决于您是否希望文件也被人类修改,文件的复杂程度以及如果脚本看起来像其他人想要不同的值,是否希望脚本优先。也就是说,如果文件已经包含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