如何轻松编辑 .conf 文件?
How can I edit a .conf file easily?
所以我读到为 bash
脚本使用 .conf 文件的最简单方法是使用 source
加载此类文件。现在,如果我想编辑这个文件怎么办?
我发现的一些代码做得非常好:
function set_config(){
sed -i "s/^\(\s*=\s*\).*$//" $conf_file
}
但是,如果变量尚未定义,它不会定义它,也不会检查参数是否正确传递、不安全、不处理默认值等...
是否已经存在可靠的 tools/code 来编辑包含 key="value" 对的 .conf 文件?例如,我希望能够做这样的事情:
$conf_file="my_script.conf"
conf_load $conf_file #should create the file if it doesn't exist !
read=$(conf_get_value "data" "default_value") #should read the value with key "data", defaulting to "default_value"
if [[ $? = 0 ]] #we should be able to know if the read was successful
then
echo "Successfully read value for field \"data\" : $read"
else
echo "Default value for field \"data\" : $read"
fi
conf_set "something_new" "a great value!" #should add the key "something_new" as it doesn't exist
conf_set "data" "new_value" #should edit the value with key "data"
if [[ $? = 0 ]]
then
echo "Edit successful !"
else #something went wrong :-/
echo "Edit failed !"
fi
在 运行 这段代码之前,conf 文件将包含
data="some_value"
之后是
data="new_value"
something_new="a great value!"
代码应该输出
Successfully read value for field "data" : some_value
Edit successful !
我正在使用 bash
版本 4.3.30。
感谢您的帮助。
我会用 awk
来解决这个问题,因为它非常擅长标记化:
# overwrite config's entries for KEY with VALUE or else appends the definition
# Usage: set_config KEY VALUE
set_config() {
[ -n "" ] && awk -F= -v key="" -v new="=\"\"" '
== key { [=10=] = new; key_found = 1; }
{ print }
END { if (!key_found) { print new; }
' "$conf_file" > "$conf_file.new" \
&& cat "$conf_file.new" > "$conf_file" && rm "$conf_file.new"
}
如果 运行 没有参数,set_config()
将不执行任何操作并且 return 为 false。如果 运行 只有一个参数,它将创建一个空值(输出 KEY=""
)。
awk
命令逐行解析 .conf 文件,查找给定键的每个定义并将其更改为新值。然后打印所有行(修改或不修改),保留原始顺序。如果到文件末尾还没有找到密钥,这将附加新定义。
因为您不能将文件通过管道传输到自身之上,所以它会以“.new”扩展名保存,然后以保留权限的方式复制到原始文件之上。然后删除“.new”副本。我使用 &&
来确保如果函数之前发生错误,这些永远不会发生。
另请注意,您所指的“.conf 文件”类型(您使用 POSIX shell 来源的类型)永远不会在等号周围有空格,因此\s*
部分 sed
命令不需要。
所以我读到为 bash
脚本使用 .conf 文件的最简单方法是使用 source
加载此类文件。现在,如果我想编辑这个文件怎么办?
我发现的一些代码做得非常好:
function set_config(){
sed -i "s/^\(\s*=\s*\).*$//" $conf_file
}
但是,如果变量尚未定义,它不会定义它,也不会检查参数是否正确传递、不安全、不处理默认值等...
是否已经存在可靠的 tools/code 来编辑包含 key="value" 对的 .conf 文件?例如,我希望能够做这样的事情:
$conf_file="my_script.conf"
conf_load $conf_file #should create the file if it doesn't exist !
read=$(conf_get_value "data" "default_value") #should read the value with key "data", defaulting to "default_value"
if [[ $? = 0 ]] #we should be able to know if the read was successful
then
echo "Successfully read value for field \"data\" : $read"
else
echo "Default value for field \"data\" : $read"
fi
conf_set "something_new" "a great value!" #should add the key "something_new" as it doesn't exist
conf_set "data" "new_value" #should edit the value with key "data"
if [[ $? = 0 ]]
then
echo "Edit successful !"
else #something went wrong :-/
echo "Edit failed !"
fi
在 运行 这段代码之前,conf 文件将包含
data="some_value"
之后是
data="new_value"
something_new="a great value!"
代码应该输出
Successfully read value for field "data" : some_value
Edit successful !
我正在使用 bash
版本 4.3.30。
感谢您的帮助。
我会用 awk
来解决这个问题,因为它非常擅长标记化:
# overwrite config's entries for KEY with VALUE or else appends the definition
# Usage: set_config KEY VALUE
set_config() {
[ -n "" ] && awk -F= -v key="" -v new="=\"\"" '
== key { [=10=] = new; key_found = 1; }
{ print }
END { if (!key_found) { print new; }
' "$conf_file" > "$conf_file.new" \
&& cat "$conf_file.new" > "$conf_file" && rm "$conf_file.new"
}
如果 运行 没有参数,set_config()
将不执行任何操作并且 return 为 false。如果 运行 只有一个参数,它将创建一个空值(输出 KEY=""
)。
awk
命令逐行解析 .conf 文件,查找给定键的每个定义并将其更改为新值。然后打印所有行(修改或不修改),保留原始顺序。如果到文件末尾还没有找到密钥,这将附加新定义。
因为您不能将文件通过管道传输到自身之上,所以它会以“.new”扩展名保存,然后以保留权限的方式复制到原始文件之上。然后删除“.new”副本。我使用 &&
来确保如果函数之前发生错误,这些永远不会发生。
另请注意,您所指的“.conf 文件”类型(您使用 POSIX shell 来源的类型)永远不会在等号周围有空格,因此\s*
部分 sed
命令不需要。