通过bash脚本编辑配置文件


9

我一直在尝试编写一个简单的bash脚本,该脚本将用于安装应用程序并更新其配置文件。我很难修改它的配置文件。

# DBHost=localhost
DBName=test
# DBPassword=

有什么建议可以使我得到如下修改吗​​?

DBHost=localhost
DBName=database
DBPassword=password

我不敢相信仅仅为了完成这项非常普通的任务就必须编写容易出错的正则表达式。确实应该有一个标准化的工具,例如“ update_config test.confg -uncomment_if_pressent DBHost = localhost”。
bigjosh

Answers:


3

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

您是否测试过此代码?还是仍然未经测试?
rubo77 '16

这里其他很好的例子:stackoverflow.com/questions/5955548/...
rubo77

2

如果这是您所需要的,则可以执行以下操作

sed  -i.bak -e 's/DBName=.*/DBName=database/' \
 -e 's/#* *DBHost=.*/DBHost=localhost/' \
 -e 's/#* *DBPassword=.*/DBPassword=password/' config.file

这会将原件复制config.fileconfig.file.bak并进行必要的更改。


2

我将在无声模式下使用“ ex”:

ex -s $CONFIG_FILE << END_CMDS
%s/^#.DBHost/DBHOST/
%s/DBName=test/DBName=database/
%s/^#.DBPassword/DBPassword/
w!
q
END_CMDS

terdon的sed命令紧凑高效。但是充满ex命令的“这里文档”与shell字符串插值的交互作用可能很强大。例如,可以将密码替换为shell变量的值:

%s/^#.DBPassword=password/DBPassword=$PASSWORD/

如果您使用vivim且熟悉':'模式,则添加新的/更好的/不同的编辑也很容易。


尽管ex功能强大,但很难从错误中恢复(例如,缺少预期的行)。在这里,您无需任何条件行为就可以逃脱,但这并不能很好地概括。
吉尔(Gilles)“所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.