需要保证key值的唯一性
function sed_key_value_file(){
key=$(echo "$1" | sed 's/[\/&]/\\&/g')
value=$(echo "$2" | sed 's/[\/&]/\\&/g')
# 先删除原有的value,然后添加新的key=value
sed -i -e "s#${key}=.*#${key}=${value}#" "$3"
}
脚本方式:
#!/bin/bash
# 获取值
get_ini_value() {
local file="$1"
local section="$2"
local key="$3"
# 无section时
if [[ -z "$section" ]]; then
awk -F ' *= *' -v key="$key" '
$1 == key { print $2; exit }
' "$file"
else
awk -F ' *= *' -v section="$section" -v key="$key" '
/^\[/{ in_section = ($0 ~ "\\[" section "\\]"); next }
in_section && $1 == key { print $2; exit }
' "$file"
fi
}
# 设置值
set_ini_value() {
local file="$1"
local section="$2"
local key="$3"
local value="$4"
local temp_file="$(mktemp)"
# 无section时
if [[ -z "$section" ]]; then
awk -F ' *= *' -v key="$key" -v value="$value" '
$1 == key { print key "=" value; found=1; next }
{ print }
END { if (!found) print key "=" value }
' "$file" > "$temp_file"
else
awk -F ' *= *' -v section="$section" -v key="$key" -v value="$value" '
/^\[/ {
if (in_section && !key_written) {
print key "=" value;
key_written = 1;
}
in_section = ($0 ~ "\\[" section "\\]");
}
!in_section || ($1 != key) { print }
in_section && ($1 == key) {
print key "=" value;
key_written = 1;
}
END {
if (in_section && !key_written) print key "=" value;
}
' "$file" > "$temp_file"
fi
mv "$temp_file" "$file"
}
# 删除整个段
del_ini_section() {
local file="$1"
local section="$2"
local temp_file="$(mktemp)"
if [[ -z "$section" ]]; then
# 如果没有指定section,则不做任何操作
return
else
awk -v section="$section" '
/^\[/ {
if (in_section) exit;
in_section = ($0 ~ "\\[" section "\\]")
}
!in_section { print }
' "$file" > "$temp_file"
fi
mv "$temp_file" "$file"
}
# 删除特定键
del_ini_key() {
local file="$1"
local section="$2"
local key="$3"
local temp_file="$(mktemp)"
# 无section时
if [[ -z "$section" ]]; then
awk -F ' *= *' -v key="$key" '
$1 != key { print }
' "$file" > "$temp_file"
else
awk -F ' *= *' -v section="$section" -v key="$key" '
/^\[/ {
if (in_section) exit;
in_section = ($0 ~ "\\[" section "\\]")
}
!in_section || ($1 != key) { print }
' "$file" > "$temp_file"
fi
mv "$temp_file" "$file"
}
# Command line handling
case $1 in
get)
echo "$(get_ini_value "$2" "$3" "$4")"
;;
set)
set_ini_value "$2" "$3" "$4" "$5"
;;
del_section)
del_ini_section "$2" "$3"
;;
del_key)
del_ini_key "$2" "$3" "$4"
;;
*)
echo "Usage:"
echo "$0 get <filename> [section] <key>"
echo "$0 set <filename> [section] <key> <value>"
echo "$0 del_section <filename> [section]"
echo "$0 del_key <filename> [section] <key>"
exit 1
;;
esac