echo "testing:"
PROXY_URL="/proxyurl/"
proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`
echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'
echo "$proxyUrlSedEscaped"
echo "???"
위의 출력은 다음과 같습니다.
testing:
\/proxyurl\/
&proxyurl&
???
마지막 에코 출력이 이전 에코 출력과 다른 이유는 무엇입니까?
명령줄을 통해 명령이 올바르게 실행됩니다:
PROXY_URL="/proxyurl/"; echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'
, 출력:\/proxyurl\/
답변1
이전 스타일의 백틱 대체 형식을 사용하는 경우 백슬래시는 뒤에
$
,`
또는 가 오지 않는 한 문자 그대로의 의미를 유지합니다\
.
`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`
이는 이중 백슬래시가 단일 백슬래시로 이스케이프되었기 때문에 명령이 실행되었음을 의미합니다 . 그런 다음 sed에서 리터럴을 생성합니다.sed
sed -e 's/[\/&]/\&/g'
\&
&
$(...)
-style 명령 대체를 사용하면 이를 방지 할 수 있습니다 .
proxyUrlSedEscaped=$(echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g')
새로운 스타일 대체를 통해 모든 명령이 일반적인 해석을 가질 수 있습니다.
꼭 사용해야 한다면 `
다소 이상한 이중 이스케이프도 작동합니다.
proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\\\&/g'`
그것은 될 것이고 \\\\
, \\
그 다음에는 sed가 당신의 것이 될 것입니다 \
.