추가됨

추가됨

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

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

\하나 (로 작성됨 \\)를 다음으로 변환합니다. \(로 작성 \\\\\\).

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

$ 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.

관련 정보