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