1

我需要使用 shell 脚本在 Linux 中管理一个配置文件,该脚本将在文件中读取和写入设置cfg。我有以下功能可以在我的脚本中使用的现有配置文件中编写一个新value的。key

set_setting() {
    sed -i "s/$1=[^ ]*/$1=$2/" $3
}

用法:

set_setting keyname NewValue /home/Config.cfg

因此,这将替换keynamein Config.cfgto的值NewValue

我还有一个get_setting使用source命令读取配置文件的功能。它同样接受两个参数keyname和源配置文件,并返回value提供的密钥。

现在的问题是,我有如下配置文件。

name=Abc
surname=Xyz

当我调用set_setting函数 as时set_setting name Def /home/Config.cfg,理想情况下它应该将namefrom的值更改AbcDef,但随着 keyname的值的更改,它也会更改surnamefrom的值,Xyz从而Def导致配置文件中的以下内容。

name=Def
surname=Def

我怀疑这是因为在两个键中都有术语“名称”,因为当我将键更改为 时surnamesurnames它按预期工作,只有值name被更改。另请注意,键的值可以是除空格之外的任何值。

我是 shell 脚本的新手,也是最近发现的sed命令。

我还提到了 SO questions thisthis。虽然他们俩都非常有帮助,但我仍然坚持上述情况。

4

1 回答 1

2

您应该将匹配锚定到该行的开头:

 sed -i "s/^$1=[^ ]*/$1=$2/" $3

注意^前面的$1。此正则表达式运算符将表达式锚定到行首,有效地要求名称是从第一个字符到=符号的所有内容。还有一个称为行尾的锚$(您在这里不需要)。

于 2012-05-12T15:03:02.223 回答