Substituir uma string no shell script usando uma variável

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"