substituição de sed com variables ​​bash

Tentando alterar valores em um arquivo de texto usando sed em um script bash com a linha,

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp 

Isso será em um loop for. Não tenho certeza porque não está funcionando. Alguma sugestão?

Variáveis ​​dentro de ' não são substituídas no bash. Para obter a substituição de string (ou interpolação, se você estiver familiarizado com o perl), será necessário alterá-lo para usar aspas duplas " vez das aspas simples:

 $ # enclose entire expression in double quotes $ sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp $ # or, concatenate strings with only variables inside double quotes $ # this would restrict expansion to relevant portion $ # and prevent accidental expansion for !, backticks, etc $ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp $ # variable cannot contain arbitrary characters $ # see link in further reading section for details $ a='foo bar' $ echo 'baz' | sed 's/baz/'"$a"'/g' sed: -e expression #1, char 9: unterminated `s' command 

Leitura adicional:

  • Diferença entre aspas simples e duplas no Bash
  • É possível escaping metacaracteres regex de forma confiável com sed
  • Usando Diferentes Delimitadores para Comando de Substituição do Sed
  • A menos que você precise em um arquivo diferente, você pode usar o sinalizador -i para alterar o arquivo no lugar

variables ​​entre aspas simples não são expandidas, entre aspas duplas, use aspas duplas neste caso.

 sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp 

Você também pode fazê-lo funcionar com eval , mas não faça isso !!

 sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

isso funcionaria?

Você pode usar variables ​​como abaixo. Como aqui, eu queria replace o hostname ou seja, a variável do sistema no arquivo. Eu estou procurando string look.me e substituindo toda a linha com look.me=

 sed -i "s/.*look.me.*/look.me=`hostname`/" 

Você também pode armazenar seu valor de sistema em outra variável e pode usar essa variável para substituição.

host_var= `hostname`

sed -i "s/.*look.me.*/look.me=$host_var/"


Arquivo de input :

 look.me=demonic 

Saída do arquivo (supondo que o nome do meu sistema seja prod-cfm-frontend-1-usa-central-1 ):

 look.me=prod-cfm-frontend-1-usa-central-1