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

通过shell脚本使用sed管理配置文件,shell,configuration,sed,read-write,Shell,Configuration,Sed,Read Write,我需要在Linux中使用shell脚本管理一个配置文件,该脚本将在cfg文件中读取和写入设置。我有以下函数在脚本中使用的现有配置文件中编写一个新的键的值 set_setting() { sed -i "s/$1=[^ ]*/$1=$2/" $3 } 用法: set\u设置keyname NewValue/home/Config.cfg 因此,这将把Config.cfg中的keyname值替换为NewValue 我还有一个函数get\u setting,它使用source命令读取配置文件

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

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

set\u设置keyname NewValue/home/Config.cfg

因此,这将把
Config.cfg
中的
keyname
值替换为
NewValue

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

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

name=Abc
surname=Xyz
当我将
set_setting
函数调用为
set_setting name Def/home/Config.cfg
时,理想情况下,它应该将
name
的值从
Abc
更改为
Def
,但同时更改键
name
的值,它还将
姓氏
的值从
Xyz
更改为
Def
,从而在配置文件中显示以下内容

name=Def
surname=Def
我怀疑这是由于两个键中都有术语“name”,因为当我将键
姓氏
更改为
姓氏
时,它按预期工作,只更改了
名称
的值。还要注意,键的值可以是除空格以外的任何值

我不熟悉shell脚本,最近发现了
sed
命令


我还提到了一些问题和建议。虽然他们两人都很有帮助,但我还是被上述情况困扰着。

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

 sed -i "s/^$1=[^ ]*/$1=$2/" $3
注意
^
前面的
$1
。这个正则表达式操作符将表达式锚定到行的开头,实际上要求名称包含从第一个字符到
=
符号的所有内容。还有一个叫做
$
的线端锚点(这里您不需要它)。

我很愚蠢。:-)谢谢!