다음에 추가

다음에 추가

문자열을 이스케이프된 따옴표가 포함된 다른 문자열로 바꿉니다.

echo "replace FOO" | sed -e "s~FOO~test\\\"test~g"

내가 기대했던 것은 replace test\"test. 대신에 나는 그것을 보았다 replace test"test.

sed이스케이프 시퀀스를 어떻게 포함할 수 있나요 ?

답변1

백슬래시는 큰따옴표 안의 이스케이프 문자와 대체 문자입니다 sed. 그래서 sed는 그것이 무엇을 의미하는지 "\\\""알 수 있습니다\""

작은따옴표를 사용해 보세요.

echo "replace FOO" | sed -e 's~FOO~test\\"test~g'

또는 이중 이스케이프:

echo "replace FOO" | sed -e "s~FOO~test\\\\\"test~g"

답변2

An \은 쉘(하나 제거)과 sed(다른 하나 제거) 모두에 특별합니다. 실제로 필요한 것이 무엇인지 sed에게 알리려면 sed에 다음 문자열을 제공해야 합니다.

s~FOO~test\\\"test~g

어떤 sed가 으로 변환되는지 test\"test, 그것이 바로 당신에게 필요한 것입니다.

\그런 다음 쉘은 각 큰따옴표와 "큰따옴표가 포함된 큰따옴표로 묶인 문자열 \"(예: 7 \)을 수신해야 합니다.

sed "s~FOO~test\\\\\\\"test~g"

쉘은 이를 "s~FOO~test\\"test~g"로 변환하고 sed는 이를 사용합니다 s~FOO~test\"test~g.

또는 더 간단하게 작은따옴표 '(3개만 사용 \)를 사용하세요.

sed 's~FOO~test\\\"test~g'

다음에 추가

댓글에서 "실제로 내부 텍스트를 환경 변수로 대체했습니다" 및 "불행히도 내 변수에 큰따옴표와 작은따옴표가 포함되어 있습니다"라고 말했습니다.

그런 다음 sed가 수신할 값으로 변수를 설정합니다. 예를 들면 다음과 같습니다.

$ var='test\'\''test\"test'; echo "$var"
test\'test\"test

그리고 슬래시가 따옴표를 이스케이프하는 데만 사용되는 경우 다음으로 변수를 수정하십시오(bash를 가정하면 휴대용 솔루션에는 더 많은 작업이 필요함).

$ echo "${var//\\/\\\\\\}"
test\\\'test\\\"test

\그러면 1 ( 로 작성됨 \\) 이 다음으로 변환됩니다. \(로 작성 \\\\\\).

교체 내용은 다음과 같습니다.

$ echo "replace FOO" | sed -e 's~FOO~'"${var//\\/\\\\\\}"'~g'

이것은아니요\모든 변수에 대한 범용 솔루션.

범용 솔루션

일반적인 솔루션에서는 모든 큰따옴표를 두 배로 늘린 \다음 각각을 이스케이프 처리하기 위해 두 번의 패스가 필요합니다.

$ var='test\'\''test\"test    aa\\\"bb\\\\\'\''cc\'\'
$ echo "$var"
test\'test\"test    aa\\\"bb\\\\\'cc\'

그런 다음 수정하십시오 var.

$ var=${var//\\/\\\\}; var=${var//\"/\\\"}; echo "$var"
test\\'test\\\"test    aa\\\\\\\"bb\\\\\\\\\\'cc\\'

교체는 다음과 같이 작동합니다.

$ echo "replace FOO" | sed -e 's~FOO~'"$var"'~g'
replace test\'test\"test    aa\\\"bb\\\\\'cc\'

변수의 원래 내용입니다 var.

관련 정보