我正在尝试为 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"
在变量后面加上空格或等号就足够了,然后一个替换就可以满足所有要求。
通过使用选项-n
和p
替换后,您不需要grep
.sed
已经 grep 正确的行了。