2011-10-06 25 views
34

tratar de cambiar los valores en un archivo de texto usando sed en una escritura del golpe con la línea,sustitución sed con variables bash

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

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

Respuesta

47

Las variables dentro de ' no se sustituyen en bash. Para obtener sustitución de cadenas (o interpolación, si está familiarizado con el Perl) que tendría que cambiar para que utilice comillas dobles " en lugar de las comillas simples:

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

También, a menos que lo necesite en un archivo diferente puede usar el indicador -i para cambiar el archivo en su lugar.

+4

Tal vez también mencione que si la variable contiene barras diagonales, necesita usar un delimitador diferente que no aparece en la cadena (o barra diagonal inversa-escape en cada aparición del delimitador). La barra inclinada es un valor predeterminado común para 's', pero puede usar cualquier carácter de puntuación; 'sed" s% draw ($ prev_number; n _)% draw ($ number; n _)% g "file.txt' o' s # from # to # g' or 's_from_to_g', etc. – tripleee

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

¿funcionaría?

13

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

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

También podría hacer que funcione con eval, pero no te hacer eso !!

+0

Gracias que funcionó. ¿Te importaría explicar a qué te refieres con ampliado? Mi intuición me dice que debería ser algo así como, variable sustituida. ¿Por qué no usar eval? – csta

1

Puede usar las variables siguientes. Al igual que aquí, quería reemplazar hostname es decir, la variable del sistema en el archivo. Busco cadena look.me y la sustitución de toda esa línea con look.me=<system_name>

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

También puede almacenar el valor del sistema en otra variable y puede utilizar esa variable para la sustitución.

host_var= `hostname`

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


Archivo de entrada:

look.me=demonic 

salida de archivo (suponiendo que mi nombre del sistema es prod-cfm-frontend-1-usa-central-1):

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