使用sed via shell脚本管理配置文件

时间:2012-05-12 13:59:56

标签: shell configuration sed read-write

我需要使用shell脚本在Linux中管理配置文件,该脚本将在cfg文件中读写设置。我有以下函数在我的脚本中使用的现有配置文件中编写value的新key

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

用法:

set_setting keyname NewValue /home/Config.cfg

因此,这会将keynameConfig.cfg的值替换为NewValue

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

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

name=Abc
surname=Xyz

当我将set_setting函数称为set_setting name Def /home/Config.cfg时,理想情况下,它应该将name的值从Abc更改为Def,但同时还会更改值密钥name,它还会将surname的值从Xyz更改为Def,从而导致配置文件中出现以下内容。

name=Def
surname=Def

我怀疑这是因为两个键都使用了“name”一词,因为当我将键surname更改为surnames时,它按预期工作,只有{{1}的值} 被改变了。另请注意,键的值可以是除空格之外的任何值。

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

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

1 个答案:

答案 0 :(得分:2)

你应该将你的比赛锚定到该行的开头:

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

请注意^前面的$1。这个正则表达式运算符将表达式锚定到行的开头,实际上要求名称是从第一个字符到=符号的所有内容。还有一个名为$的终端锚点(这里你不需要)。