我一直在尝试编写一个简单的 bash 脚本,我将用它来安装应用程序并更新其配置文件。我很难修改它的配置文件。
# DBHost=localhost
DBName=test
# DBPassword=
有什么建议可以将上面的内容修改如下吗?
DBHost=localhost
DBName=database
DBPassword=password
答案1
最好的方法取决于您是否希望该文件也被人类修改、文件的复杂程度以及您是否希望您的脚本在其他人想要不同的值时优先。也就是说,如果文件已包含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
答案2
如果这就是你所需要的,你可以做类似的事情
sed -i.bak -e 's/DBName=.*/DBName=database/' \
-e 's/#* *DBHost=.*/DBHost=localhost/' \
-e 's/#* *DBPassword=.*/DBPassword=password/' config.file
这会将原始文件复制config.file
到config.file.bak
并进行必要的更改。
答案3
我将在静默模式下使用“ex”:
ex -s $CONFIG_FILE << END_CMDS
%s/^#.DBHost/DBHOST/
%s/DBName=test/DBName=database/
%s/^#.DBPassword/DBPassword/
w!
q
END_CMDS
特登的sed
指挥紧凑而高效。但是,充满 ex 命令和 shell 字符串插值的“此处文档”的交互可能非常强大。例如,密码可以替换为 shell 变量的值:
%s/^#.DBPassword=password/DBPassword=$PASSWORD/
如果您使用vi
orvim
并且熟悉“:”模式,添加新的/更好的/不同的编辑也非常容易。