2011-10-06 20 views
34

cercando di cambiare i valori in un file di testo utilizzando sed in uno script bash con la linea,sostituzione sed con le variabili bash

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

Questo sarà in un ciclo for. Non sono sicuro del motivo per cui non funziona. Eventuali suggerimenti?

risposta

47

Le variabili all'interno di ' non vengono sostituite in bash. Per ottenere la sostituzione di stringhe (o interpolazione, se si ha familiarità con il Perl) si avrebbe bisogno di modificarlo per usare le virgolette " al posto delle virgolette singole:

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

Inoltre, a meno che non ne hai bisogno in un file diverso è possibile utilizzare il flag -i per modificare il file in posizione.

+4

Forse anche menzionare che se la variabile contiene barre, è necessario utilizzare un delimitatore diverso che non si verifica nella stringa (o backslash-escape ogni occorrenza del delimitatore). La barra è un valore predefinito comune per 's', ma è possibile utilizzare qualsiasi carattere di punteggiatura; 'sed" s% draw ($ numero_visto; n _)% draw ($ numero; n _)% g "file.txt' o' s # da # a # g' o 's_from_to_g' ecc. – tripleee

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

sarebbe questo lavoro?

13

le variabili tra virgolette singole non vengono espanse, tra virgolette doppie, in questo caso utilizzare virgolette doppie.

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

Si potrebbe anche farlo funzionare con eval, ma non lo farlo !!

+0

Grazie a quello ha funzionato. Ti dispiacerebbe spiegare cosa intendi per estensione? La mia intuizione mi dice che dovrebbe essere qualcosa di simile, variabile sostituita. Inoltre, perché non usare eval? – csta

1

È possibile utilizzare variabili come di seguito. Come qui, ho voluto sostituire hostname ad es., Variabile di sistema nel file. Sto cercando di stringa look.me e sostituzione che tutta la linea con look.me=<system_name>

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

È inoltre possibile memorizzare il valore di sistema in altra variabile e può utilizzare tale variabile per la sostituzione.

host_var= `hostname`

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


file di input:

look.me=demonic 

uscita di un file (supponendo che il mio nome del sistema è prod-cfm-frontend-1-usa-central-1):

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