다음 문자열을 삽입하려는 파일이 있습니다.
export TRUSTED_PROXIES='"172.16.0.0/12, 172.17.0.0/12"'
[root@sasasas]# echo $TRUSTED_PROXIES
"172.16.0.0/12, 172.17.0.0/12"
하지만 다음 오류가 발생합니다.
[root@sasasas]# sed -i '2i trusted_proxies ='$TRUSTED_PROXIES'' log.conf
sed: can't read 172.17.0.0/12": No such file or directory
그러나 실제 값으로 아래 명령을 실행하면 작동합니다.
sed -i '2 i trusted_proxies =172.16.0.0/12, 172.17.0.0/12' log.conf
쉼표로 구분된 환경 변수 값을 이스케이프 처리하고 파일에 삽입하는 방법은 무엇입니까? 저는 리눅스를 사용하고 있습니다.
내가 시도한 명령은 다음과 같습니다
sed -i '2i trusted_proxies ='$TRUSTED_PROXIES'' log.conf
sed -i '2i trusted_proxies ="$TRUSTED_PROXIES"' log.conf
sed -i "2i trusted_proxies ='$TRUSTED_PROXIES'" log.conf
sed -i "2i trusted_proxies ="$TRUSTED_PROXIES"" log.conf
답변1
변수에 공백이 포함되어 있고 따옴표 없이 전달하기 때문에 쉘은 변수를 확장하려고 시도하며 sed
실제로 보는 것은 두 번째 값인 파일입니다. 실행하면 이해하기가 더 쉬울 수 있으므로 set -x
셸에서 실행되는 확장 명령을 볼 수 있습니다.
$ set -x
$ sed -i '2i trusted_proxies ='$TRUSTED_PROXIES'' file
+ sed -i '2i trusted_proxies ="172.16.0.0/12,' '172.17.0.0/12"' file
sed: can't read 172.17.0.0/12": No such file or directory
위에서 볼 수 있듯이 실제 명령 실행은 다음과 같습니다.
sed -i '2i trusted_proxies ="172.16.0.0/12,' '172.17.0.0/12"'
sed
이라는 파일을 찾는 경우에도 마찬가지입니다 '172.17.0.0/12"'
. 해결책은 변수를 큰따옴표로 묶는 것입니다.
sed -i '2i trusted_proxies ='"$TRUSTED_PROXIES"'' file
또는 더 간단하게 sed
전체 명령을 큰따옴표로 묶고 인쇄된 값을 작은따옴표로 묶습니다.
sed -i "2i trusted_proxies ='$TRUSTED_PROXIES'" file
답변2
Inputfile
praveen@praveen:~$ cat k3
10
20
TRUSTED_PROXIES='"172.16.0.0/12, 172.17.0.0/12"'
awk -v TRUSTED_PROXIES="$TRUSTED_PROXIES" 'NR==2{$0="trusted_proxies="TRUSTED_PROXIES"\n"$0}1' k3 >k3_temp && mv k3_temp k3
output
10
trusted_proxies="172.16.0.0/12, 172.17.0.0/12"
20