2010-07-08 17 views
14

ho eseguire il seguente script bash:Come utilizzare una variabile script bash con sed

#!/bin/bash 
version=$1 
echo $version 
sed 's/\${version.number}/$version/' template.txt > readme.txt 

mi aspetto di sostituire tutte le istanze di $ {} version.number con i contenuti della "versione" variabile . Invece viene inserito il testo letterale $ version.

Cosa devo fare per rendere sed invece il valore corrente di $ versione?

risposta

17
sed "s/\${version.number}/$version/" template.txt > readme.txt 

Solo le virgolette doppie sostituiscono il simbolo del dollaro. Ciò significa anche che le virgolette singole non richiedono che il simbolo del dollaro sia sfuggito.

+0

Ma il simbolo del dollaro deve essere scappato perché l'espressione è trattata come un'espressione regolare da 'sed'. Quindi penso che dovrebbe essere '\\ $'. – Philipp

+1

@Philipp, in realtà il segno '$' è solo un'ancora quando è l'ultimo carattere della regex (o eventualmente sottoespressione). Ma ammetto di essere stato fortunato. ;) Puoi opzionalmente aggiungere una barra di escape, ma è '\\\ $'. –

+0

Grazie per la correzione. – Philipp

4

Si potrebbe anche semplicemente chiuse virgolette le variabili

sed 's/'${version.number}'/'$version'/' template.txt > readme.txt 
+0

Questo ha funzionato meglio. – Val

0

E 'un po' vecchio, ma potrebbe ancora essere utile ... Per me ha funzionato utilizzando un doppio fuga come ha detto Philip (e fuggire tra parentesi, se li usi ...):

#!/bin/bash 
LIVE_DB_NAME='wordpress'; 
STAGING='staging'; 
sed -r "s/define\('DB_NAME', '[a-zA-Z0-9]+'\);/define('DB_NAME', '\\${LIVE_DB_NAME}');/" ${STAGING}/wp-config.php >tmp1; 
Problemi correlati