是否有任何工具可以从shell脚本修改INI样式文件

时间:2010-08-12 09:33:09

标签: shell debian packaging ini

我正在构建vnc的自定义程序包,并希望确保在程序包安装后脚本中启用GDM的xdcmp设置。 gdm.conf文件是一个ini样式文件,即:

[section]
var=name

我想要设置的值在整个配置文件的不同部分都有名称冲突。是否有任何工具可以轻松地从shell脚本中操作ini样式配置文件?我想在.deb postinst脚本中对此进行排序。

3 个答案:

答案 0 :(得分:1)

如果你愿意写一些Perl,那就是Config::IniFiles(包libconfig-inifiles-perl)。

答案 1 :(得分:1)

看一下crudini包。它专为从shell

操作ini文件而设计

答案 2 :(得分:0)

使用Ex编辑器的Shell命令(以更改var键的值):

ex +"%s/^var=\zs.*/new_name/" -scwq config.ini

要支持INI节,请使用以下语法:

ex +':/\[section\]/,$s/var=\zs.*/new_name/' -scwq config.ini

有关从INI文件中读取值的信息,请参见:How do I grab an INI value within a shell script?


以下是shell函数,可用于编辑INI值(不支持部分):

# Set value in the INI file.
# Usage: ini_set [key] [value] [file]
ini_set()
{
  local key="$1"
  local value="$2"
  local file="$3"
  [ -f "$file" ]
  if [ -n "$value" ]; then
    if grep -q "$key" "$file"; then
      echo "INFO: Setting '$key' to '$value' in $(basename "$file")"
      ex +'%s#'"$key"'=\zs.*$#'"$value"'#' -scwq! "$file"
    else
      echo "$key=$value" >> "$file"
    fi
  else
    echo "WARN: Value for '$key' is empty, ignoring."
  fi
}

这里是shell函数,用于读取INI值(不支持部分):

# Get value from the INI file.
# Usage: ini_get [key] (file)
ini_get()
{
  local key="$1"
  local file="$2"
  [ ! -s "$file" ] && return
  local value="$(grep -om1 "^$key=\S\+" "$file" | head -1 | cut -d= -f2-)"
  echo "Getting '$key' from $(basename "$file"): $value" >&2
  echo $value
}

例如ini_get var