sed를 사용하여 스크립트에 여러 줄 삽입

sed를 사용하여 스크립트에 여러 줄 삽입

스크립트의 특정 줄 앞에 변수를 삽입하려고 합니다. 이것은 내가 사용하는 코드입니다:

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 코드에 쉘 변수를 삽입할 때는 주의가 필요합니다. 사용하기 전에 중성화 수술을 해야 합니다. 예를 들어, 쉘 변수에 슬래시 "/"가 있으면 어떻게 될까요?

관련 정보