우리 회사 표준에 맞게 구성 파일을 수정하는 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