2010-07-08 16 views
14

I wykonać następujący skrypt bash:Jak użyć zmiennej skryptu bash z sed

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

Czekam zastąpić wszystkie wystąpienia $ {version.number} z zawartością zmiennej „wersji” . Zamiast tego wstawiana jest dosłowna wersja tekstowa $.

Co muszę zrobić, aby sed używał zamiast tego bieżącej wartości wersji $?

Odpowiedz

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

Tylko podwójne kwotowanie zastępuje znak dolara. Oznacza to również, że pojedyncze cudzysłowy nie wymagają znaku dolara.

+0

Ale znak dolara musi zostać usunięty, ponieważ wyrażenie jest traktowane jako wyrażenie przez "sed". Myślę więc, że powinno to być '\\ $'. – Philipp

+1

@Philipp, tak naprawdę znak '$' jest tylko kotwicą, gdy jest ostatnim znakiem wyrażenia regularnego (lub ewentualnie podwyrażeniem). Ale przyznaję, że miałem szczęście. ;) Opcjonalnie można dodać ukośnik, ale jest to '\\\ $'. –

+0

Dzięki za poprawkę. – Philipp

4

Można też po prostu koniec cytatu zmienne

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

To działało najlepiej. – Val

0

to trochę stary, ale nadal może być pomocne ... Dla mnie to zadziałało, używając podwójnego ucieczkę jako Philip powiedział (a uciekając nawias, jeżeli używasz ich ...):

#!/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;