com*_*xtr 10 bash configuration shell-script text-processing
我一直在尝试编写一个简单的 bash 脚本,我将用它来安装应用程序并更新它的配置文件。我很难修改它的配置文件。
# DBHost=localhost
DBName=test
# DBPassword=
Run Code Online (Sandbox Code Playgroud)
有什么建议我可以按照下面的方式进行修改吗?
DBHost=localhost
DBName=database
DBPassword=password
Run Code Online (Sandbox Code Playgroud)
最好的方法取决于您是否希望该文件也被人类修改、文件的复杂程度以及您是否希望您的脚本在其他人想要不同的值时优先。也就是说,如果文件已包含DBPassword=swordfish
,您要保留它还是将其替换为DBPassword=password
?
处理此问题的常见方法是使用 \xe2\x80\x9cmagic comments\xe2\x80\x9d 分隔文件的一部分,并且仅编辑这些注释之间的部分。这是使用 awk 执行此操作的方法。如果魔术注释不存在,则新部分将添加到文件末尾。警告:未经测试的代码。
\n\nbegin_marker=\'# BEGIN AUTOMATICALLY EDITED PART, DO NOT EDIT\'\nend_marker=\'# END AUTOMATICALLY EDITED PART\'\nnew_section=\'DBHost=localhost\nDBName=database\nDBPassword=password\'\nexport begin_marker end_marker\nawk <file.conf >file.conf.new -v begin_marker="$begin_marker" -v begin_marker="$end_marker" -v new_section="$new_section" \'\n 1 {print}\n $0 == begin_marker && !changed {\n do {getline} while ($0 != end_marker); # discard old section content\n print new_section;\n print;\n changed = 1;\n }\n END {if (!changed) {print begin_marker; print new_section; print end_marker;}}\n\'\nln -f file.conf file.conf.old\nmv -f file.conf.new file.conf\n
Run Code Online (Sandbox Code Playgroud)\n\n如果读取配置文件的程序不支持多行设置同一配置项,则此方法效果不佳。在这种情况下,您确实需要删除旧的。在这种情况下,我建议保持注释不变,并在最后添加您自己的设置。
\n\ngrep -vE \'^[[:blank:]]*(DBHost|DBName|DBPassword)=$\' <file.conf >file.conf.new\ncat <<EOF >>file.conf.new\nDBHost=localhost\nDBName=database\nDBPassword=password\nEOF\nln -f file.conf file.conf.old\nmv -f file.conf.new file.conf\n
Run Code Online (Sandbox Code Playgroud)\n