스크립트의 특정 줄 앞에 변수를 삽입하려고 합니다. 이것은 내가 사용하는 코드입니다:
var1=$(echo "database1=")
var2=$(echo "database2=")
var3=$(echo "database3=")
sed -i "/#variables/i \
$var1\
$var2\
$var3" /data1/create_database
create_database
위 명령을 실행한 후 다음과 같이 표시되기를 원합니다 .
database1=
database2=
database3=
#variables
그러나 나는 다음과 같은 결과를 얻습니다.
database1= database2= database3=
#variables
여러 가지 방법을 시도했지만 소용이 없었습니다. 어떻게 해야 합니까?
답변1
변수를 설정하기 위해 명령 대체가 필요하지 않습니다.
var1="database1="
var2="database2="
var3="database3="
개행을 추가하려면 작은따옴표가 필요하다고 생각하지만 변수를 큰따옴표로 인용하면 보기 흉해 보입니다. 변수에 공백 문자가 포함되어 있으면 큰따옴표가 필요합니다.
sed -i '/#variables/i\
'"$var1"'\
'"$var2"'\
'"$var3" /data1/create_database
GNU sed를 사용하면 간단하게 개행 문자를 추가할 수 있습니다:
sed -i "/#variables/i$var1\n$var2\n$var3" /data1/create_database
답변2
이스케이프 시퀀스( \n
)를 사용하여 줄 바꿈을 삽입할 수 있습니다. 알아채다
sed -i "/#variables/i \
$var1\n$var2\n$var3" /data1/create_database
동등하다
sed -i "/#variables/i $var1\n$var2\n$var3" /data1/create_database
따라서 이중 백슬래시가 필요합니다.
sed -i "/#variables/i\\
$var1\n$var2\n$var3" /data1/create_database
각 표현식이 실제로 한 줄인 한 줄 명령으로 만들기 위해 여러 표현식을 사용하는 것도 고려해 보세요.
sed -i -e '/#variables/i\' -e "$var1\n$var2\n$var3" /data1/create_database
마지막으로 변수를 이스케이프해야 할 수도 있습니다.
var1=$(echo "database1=" | sed 's/[]\/$*.^&[]/\\&/g')
var2=$(echo "database2=" | sed 's/[]\/$*.^&[]/\\&/g')
var3=$(echo "database3=" | sed 's/[]\/$*.^&[]/\\&/g')
sed -i -e '/#variables/i\' -e "$var1\n$var2\n$var3" /data1/create_database
답변3
큰따옴표 내에서 작업하므로 백슬래시 수를 두 배로 늘려야 합니다.
sed -i "/#variables/i \\
$var1\\
$var2\\
$var3" /data1/create_database
그 망할 백슬래시를 세는 것보다 더 나은 일이 있다면 sed
세부 사항을 처리하도록 허용할 수 있지만 그렇게 하면 코드 비용이 발생합니다.
sed -i "/#variables/{H;s/.*//;x;}
s/\\n/$var1&$var2&$var3&/
" /data1/create_database
또는 개행에 대한 언급이 없는 경우:
sed -i "/#variables/{
h
s/.*/$var1/p
s/.*/$var2/p
s/.*/$var3/p
g
}" /data1/create_database
물론 sed 코드에 쉘 변수를 삽입할 때는 주의가 필요합니다. 사용하기 전에 중성화 수술을 해야 합니다. 예를 들어, 쉘 변수에 슬래시 "/"가 있으면 어떻게 될까요?