sed 函数替换任何配置文件条目

sed 函数替换任何配置文件条目

我正在尝试为 SLES/RHEL 编写一个构建脚本,该脚本修改配置文件以符合我们公司的标准。有些配置的格式为设置 = 值,有些只是设置值。我目前正在使用 sed ,感觉我已经快到了,但是当没有等号时它不起作用。

当前代码:(抱歉,我还不太擅长正确格式化这些......)

$ cat test.conf
setting1 value1 
setting2= value2
setting3 = value3
setting4 =value4 

当前(测试)功能:

#!/bin/bash
replace () {  
file=$1  
var=$2  
new_value=$3



sed -e "s/^$var=.*/$var = $new_value/" -e "s/^$var =.*/$var = $new_value/" -e "s/^$var.*/$var = $new_value/" -e "s/^$var /$var $new_value/" "$file"|grep $var  

}


replace test.conf setting1 value1new 
replace test.conf setting2 value2new  
replace test.conf setting3 value3new  
replace test.conf setting4 value4new

但是我得到这个结果:

$ ./functiontest
setting1 value1new= value1new 
setting2 value2new= value2new 
setting3 value3new= value3new 
setting4 value4new= value4new

如果我取出最后一个 sed 部分,但只有在有等号的地方,它才有效。

有什么想法我做错了吗?

答案1

你可以简化“相似”的集合sed替换为以下内容:

cat replace.sh 
#!/bin/bash
replace () {
var=$2  
new_val=$3

sed -e "s/^$var *= *.*/$var = $new_val/; s/^$var [^=]*$/$var $new_val/" "$1" | grep $var 

}

replace test.conf setting1 value1new 
replace test.conf setting2 value2new  
replace test.conf setting3 value3new  
replace test.conf setting4 value4new

用法

bash replace.sh

输出:

setting1 value1new
setting2 = value2new
setting3 = value3new
setting4 = value4new

答案2

sed -n "s/^$var[ =].*/$var = $new_value/p" "$file"

在变量后面加上空格或等号就足够了,然后一个替换就可以满足所有要求。

通过使用选项-np替换后,您不需要grep.sed已经 grep 正确的行了。

相关内容