쉘 스크립트 내부의 문자열을 대체하기 위해 아래 코드를 사용하고 있습니다.
echo $LINE | sed -e 's/12345678/"$replace"/g'
하지만 $replace
그 변수의 값 대신에 대체되고 있습니다.
아무도 무엇이 잘못되었는지 말할 수 있습니까?
답변:
해석하려는 경우 $replace
작은 따옴표는 변수 대체를 방지하므로 사용하지 않아야합니다.
시험:
echo $LINE | sed -e "s/12345678/\"${replace}\"/g"
당신이 따옴표에 넣어 원하는 가정이있는 경우. 하지 않는 , 사용을 인용합니다 :
echo $LINE | sed -e "s/12345678/${replace}/g"
성적 증명서:
pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _
이스케이프하지 않는 한 혼동을 일으킬 수 있으므로 (예 를 들어) ${replace}
중요한 문자가 없는지 확인하십시오 . 그러나 말했듯이 한 번호를 다른 번호로 바꾸는 경우 문제가되지 않습니다.sed
/
set
또한 필요하지 않습니다 (어쨌든 어떻게 사용하려고 했습니까?). 그냥 replace=987654321
.
export
아이들을 위해 변수가 설정되도록 항상 사용 하지만, 당신이 말했듯이 쉽게 피할 수 있습니다. 그러나의 사용 여부 export
는 여기서 (스타일 문제)와 관련이 없으며 sed
명령 내에서 변수를 사용하는 방법 인 실제 답변에는 영향을 미치지 않습니다 .
-i
옵션 으로 작동하지 않는 것 같습니다 . 이유를 아십니까? 또는 작동하게하는 방법?
$
또는 `
에서 sed
스크립트를 두 번 인용 된 문자열을 쉘의 대체 메커니즘로부터 보호하기 위해, 백 슬래시로 이스케이프 할 수 있습니다.
질문에 국한되지 않지만 이전 답변에서 명확성을 위해 확장 된 동일한 종류의 기능이 필요한 사람들을 위해 :
# create some variables
str="someFileName.foo"
find=".foo"
replace=".bar"
# notice the the str isn't prefixed with $
# this is just how this feature works :/
result=${str//$find/$replace}
echo $result
# result is: someFileName.bar
str="someFileName.sally"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result
# result is: someFileName.sally because ".foo" was not found
echo $LINE | sed -e 's/12345678/'$replace'/g'
여전히 작은 따옴표를 사용할 수 있지만 올바른 위치에서 변수를 확장하려면 "열어야"합니다. 그렇지 않으면 문자열이 "문자 그대로"사용됩니다 (@paxdiablo가 올바르게 언급했듯이 그의 대답도 정확합니다)
$replace
따옴표 외부 를 사용 하면 쉘이 값에 대해 공백 토큰 화 및 와일드 카드 확장을 수행하게 되는 문제 가 있습니다. 이것은 단순한 값으로 작동하는 것처럼 보이지만 사소하지 않은 문자열에서는 극적으로 폭발 할 수 있습니다. 프로덕션 코드에서 이것을 사용하지 마십시오.