sustitución sed con variables de bash

Intentando cambiar los valores en un archivo de texto usando sed en un script bash con la línea,

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

Esto estará en un bucle for. No estoy seguro de por qué no está funcionando. ¿Alguna sugerencia?

    Las variables dentro de ' no se sustituyen en bash. Para obtener la sustitución de cadenas (o interpolación, si está familiarizado con Perl), deberá cambiarla para usar comillas dobles " lugar de las comillas 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 

    Otras lecturas:

    • Diferencia entre comillas simples y dobles en Bash
    • ¿Es posible escapar metacaracteres de expresiones regulares de forma confiable con sed
    • Usar diferentes delimitadores para el comando sustituto sed
    • A menos que lo necesite en un archivo diferente, puede usar el distintivo -i para cambiar el archivo en su lugar

    las variables dentro de comillas simples no se expanden, dentro de las comillas dobles que son, use comillas dobles en este caso.

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

    También puedes hacer que funcione con eval , ¡pero no hagas eso!

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

    ¿Esto funcionaría?

    Puedes usar variables como a continuación. Al igual que aquí, quería reemplazar el hostname , es decir, la variable del sistema en el archivo. Estoy buscando string look.me y reemplazando esa línea completa con look.me=

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

    También puede almacenar el valor de su sistema en otra variable y puede usar esa variable para la sustitución.

    host_var= `nombre de host_var=

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


    Fichero de entrada :

     look.me=demonic 

    Salida del archivo (suponiendo que el nombre de mi sistema sea prod-cfm-frontend-1-usa-central-1 ):

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