Eu estou usando o código abaixo para replace uma string dentro de um script de shell.
echo $LINE | sed -e 's/12345678/"$replace"/g'
mas está sendo substituído por $replace
vez do valor dessa variável.
Alguém poderia dizer o que deu errado?
Se você quiser interpretar $replace
, você não deve usar aspas simples, pois elas evitam a substituição de variables.
Experimentar:
echo $LINE | sed -e "s/12345678/\"${replace}\"/g"
supondo que você quer que as cotações sejam colocadas. Se você não quiser as cotações, use:
echo $LINE | sed -e "s/12345678/${replace}/g"
Transcrição:
pax> export replace=987654321 pax> echo X123456789X | sed "s/123456789/${replace}/" X987654321X pax> _
Apenas tome cuidado para garantir que ${replace}
não tenha caracteres significativos para o sed
(como /
por exemplo), pois isso causará confusão, a menos que seja escapado. Mas se, como você diz, você está substituindo um número por outro, isso não deve ser um problema.
você pode usar o shell (bash / ksh).
$ var="12345678abc" $ replace="test" $ echo ${var//12345678/$replace} testabc
Não é específico para a pergunta, mas para pessoas que precisam do mesmo tipo de funcionalidade expandida para maior clareza das respostas anteriores:
str="someFileName.foo" find=".foo" replace=".bar" 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
Aspas simples são muito fortes. Uma vez lá dentro, não há nada que você possa fazer para invocar a substituição de variables, até você sair. Use aspas duplas em vez disso:
echo $LINE | sed -e "s/12345678/$replace/g"
echo $LINE | sed -e 's/12345678/'$replace'/g'
você ainda pode usar aspas simples, mas precisa “abri-las” quando quiser que a variável seja expandida no lugar certo. caso contrário, a string é tomada “literalmente” (como @paxdiablo corretamente declarado, sua resposta também está correta)
Para deixar seu shell expandir a variável, você precisa usar aspas duplas como
sed -i "s#12345678#$replace#g" file.txt
Isso será interrompido se $replace
contiver caracteres especiais sed
( #
, \
). Mas você pode pré-processar $replace
para citá-los:
replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g') sed -i "s#12345678#$replace_quoted#g" file.txt
Use isso
echo $LINE | sed -e 's/12345678/$replace/g'
isso funciona para mim simplesmente remover as aspas
Eu prefiro usar aspas duplas, pois as quptes simples são muito poderosas como as usamos se não conseguirmos mudar nada dentro dela ou se pudermos invocar a variável de substituição.
então use aspas duplas instaed.
echo $LINE | sed -e "s/12345678/$replace/g"