
문자열을 이스케이프된 따옴표가 포함된 다른 문자열로 바꾸겠습니다.
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
.