쉘 스크립트 내부의 문자열을 대체하기 위해 아래 코드를 사용하고 있습니다.
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
/
답변
쉘 (bash / ksh)을 사용할 수 있습니다.
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
답변
질문에 국한되지 않지만 이전 답변에서 명확성을 위해 확장 된 동일한 종류의 기능이 필요한 사람들을 위해 :
# 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//12345678/$replace}
답변
작은 따옴표는 매우 강력합니다. 일단 안으로 들어가면 떠날 때까지 변수 대체를 호출하기 위해 할 수있는 일이 없습니다. 대신 큰 따옴표를 사용하십시오.
echo $LINE | sed -e "s/12345678/$replace/g"
답변
echo $LINE | sed -e 's/12345678/'$replace'/g'
여전히 작은 따옴표를 사용할 수 있지만 올바른 위치에서 변수를 확장하려면 “열어야”합니다. 그렇지 않으면 문자열이 “문자 그대로”사용됩니다 (@paxdiablo가 올바르게 언급했듯이 그의 대답도 정확합니다)
답변
쉘이 변수를 확장하게하려면 다음과 같은 큰 따옴표를 사용해야합니다.
sed -i "s#12345678#$replace#g" file.txt
$replace
특수 sed
문자 ( #
, \
) 가 포함 된 경우 중단됩니다 . 그러나 $replace
이를 인용하기 위해 사전 처리 할 수 있습니다.
replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g')
sed -i "s#12345678#$replace_quoted#g" file.txt