sed 명령에서 쉘 변수를 사용하는 방법은 무엇입니까? [복사]

sed 명령에서 쉘 변수를 사용하는 방법은 무엇입니까? [복사]

$ 기호를 사용하여 변수 값을 얻을 수 있다는 것을 알고 있습니다.

x=3
echo $x
3

$ 기호를 사용하지 않고 값을 얻는 데 사용할 수 있는 다른 방법이 있습니까?

$ 기호가 특수 문자이고 이를 수행하려고 할 때 오류가 발생하기 때문에 이렇게 묻습니다 sed.sed: -e expression #1, char 31: unterminated s' command

A=25 #lineNumber
destStr="192.168.1.3 192.168.1.4"
sed ""$A"s/Allow from .*/Allow from $destStr/" -i test2

destStr이스케이프 문자를 사용하면 (값 대신) 문자열이 인쇄됩니다 \.

sed ""$A"s/Allow from .*/Allow from \$destStr/" -i test2

echo대신 사용하십시오 sed:

25s/Allow from .*/Allow from  192.168.1.3
192.168.1.4
/ -i test2

답변1

최종 편집에서 볼 수 있듯이 문제는 달러 기호와 관련이 없지만 의 내용으로 인해 발생합니다 deststr. 이는 192.168.1.3 192.168.1.4두 줄에 불과하며 하나는 만 포함 192.168.1.3하고 다른 줄은 192.168.1.4개행 문자로 끝나는 두 줄입니다. 즉, 변수 대체 후의 실제 명령은 다음과 같습니다.

sed "25s/Allow from .*/Allow from  192.168.1.3
192.168.1.4
/" -i test2

이제 명령줄이 sed한 줄씩 해석되므로 해석하려는 첫 번째 명령은 다음과 같습니다.

25s/Allow from .*/Allow from  192.168.1.3

이는 분명히 종료되지 않은 s주문이므로 sed그렇게 보고됩니다.

이제 찾은 솔루션은 echo다음과 같이 작동합니다.

echo $var

에코에게 전화 걸기인수(공백이 인용되지 않았기 때문에 인수 구분 기호로 해석됨), 첫 번째는 이고 192.168.1.3두 번째는 192.168.1.4둘 다 셸에서 더 이상 해석되지 않는 형식입니다.

이제 echo공백으로 구분된(옵션이 아닌) 인수만 출력되므로 이제 명령줄이 표시됩니다.

sed "25s/Allow from .*/Allow from  192.168.1.3 192.168.1.4/" -i test2

예상대로.

$()그러나 명령 대체의 경우 백틱은 오류가 발생하기 쉬우므로 가능할 때마다 백틱을 사용해야 합니다 . 따라서 다음은 귀하의 요구 사항을 충족합니다.

sed "$A s/Allow from .*/Allow from $(echo $destStr)/" -i test2

인용을 단순화하기 위해 주소와 명령 사이에 공백이 허용된다는 사실도 활용했습니다 sed. 이러한 추가 공백이 불가능한 경우 다음 구문을 사용할 수도 있습니다.

sed "${A}s/Allow from .*/Allow from $(echo $destStr)/" -i test2

destStr이는 공백이 아닌 문자가 쉘이나 sed대체 문자열에 나타나는 문자 에 의해 해석되지 않는다는 사실에 의존한다는 점에 유의하십시오 .

답변2

echo다음을 사용하여 문제를 성공적으로 해결했습니다 .

sed ""$A"s/Allow from .*/Allow from `echo $destStr`/" -i test2

하지만 $ 기호를 사용하지 않고 값을 얻을 수 있는 다른 방법이 있는지 알고 싶습니다.

답변3

스크립트에서 다음을 수행할 수 있습니다.

sed -e "${A}s/Allow from .*/Allow from ${destStr}/" -i test2

${variable}bash가 ${variable}s/...원하는 방식으로 해석하도록 하는 데 사용합니다 .

답변4

무엇에 대해

sed $A's/Allow from .*/Allow from '$destStr'/' -i test2

destStr에는 흰색이 없다고 가정합니다.

또는

echo $A"s/Allow from .*/Allow from $destStr/" | sed -f - -i test2

두 번째 형태는 흰색을 허용합니다.

관련 정보