sustitución de sed con variables Bash
Estoy 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 for
bucle. ¿Por qué no funciona?
Aceptado
Las variables internas '
no se sustituyen en Bash. Para obtener sustitución de cadenas (o interpolación, si está familiarizado con Perl), deberá cambiarla para usar comillas dobles "
en lugar de comillas simples:
# Enclose the 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 the relevant portion
# and prevent accidental expansion for !, backticks, etc.
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp
# A variable cannot contain arbitrary characters
# See link in the 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 de los metacaracteres de expresiones regulares de manera confiable con sed?
- Usando diferentes delimitadores para el comando sustituto sed
- A menos que lo necesite en un archivo diferente, puede usar el indicador -i para cambiar el archivo en su lugar.
Las variables entre comillas simples no se expanden, pero sí entre comillas dobles. Utilice comillas dobles en este caso.
sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
¡También puedes hacerlo funcionar con eval
, pero no hagas eso!
Esto puede ayudar:
sed "s/draw($prev_number;n_)/draw($number;n_)/g"