我需要使用shell脚本在Linux中管理配置文件,该脚本将在cfg
文件中读写设置。我有以下函数在我的脚本中使用的现有配置文件中编写value
的新key
。
set_setting() {
sed -i "s/$1=[^ ]*/$1=$2/" $3
}
用法:
set_setting keyname NewValue /home/Config.cfg
因此,这会将keyname
中Config.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
命令。
答案 0 :(得分:2)
你应该将你的比赛锚定到该行的开头:
sed -i "s/^$1=[^ ]*/$1=$2/" $3
请注意^
前面的$1
。这个正则表达式运算符将表达式锚定到行的开头,实际上要求名称是从第一个字符到=
符号的所有内容。还有一个名为$
的终端锚点(这里你不需要)。