sustitución de sed con variables Bash

Resuelto csta asked hace 13 años • 6 respuestas

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 forbucle. ¿Por qué no funciona?

csta avatar Oct 07 '11 04:10 csta
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.
k.parnell avatar Oct 06 '2011 21:10 k.parnell

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!

Paul Creasey avatar Oct 06 '2011 21:10 Paul Creasey

Esto puede ayudar:

sed "s/draw($prev_number;n_)/draw($number;n_)/g" 
Kent avatar Oct 06 '2011 21:10 Kent