2013-10-03 10 views
34

mam abc.sh:Jak używać zmiennych w poleceniu w sed?

exec $ROOT/Subsystem/xyz.sh 

na polu Unix, jeśli mogę wydrukować echo $HOME potem dostać /HOME/COM/FILE.

Chcę zastąpić $ROOT z $HOME przy użyciu sed.

oczekiwany wynik:

exec /HOME/COM/FILE/Subsystem/xyz.sh 

Próbowałem, ale nie dostaję oczekiwany wynik:

sed 's/$ROOT/"${HOME}"/g' abc.sh > abc.sh.1 

Dodatek:

Jeśli mam abc.sh

exec $ROOT/Subsystem/xyz.sh $ROOT/ystem/xyz1.sh 

następnie

sed "s|\$INSTALLROOT/|${INSTALLROOT}|" abc.sh 

jest zastąpienie tylko pierwszy $ROOT, to wyjście zbliża jak

exec /HOME/COM/FILE/Subsystem/xyz.sh $ROOT/ystem/xyz1.sh 
+0

możliwe duplikat [zastąpić ciąg w skrypcie] (http : //stackoverflow.com/questions/3306007/replace-a-string-in-shell-script) – tripleee

+3

@tripleee Chociaż jestem pewien, że byłby to duplikat wielu innych pytań, które wskazałeś nie jest najlepszy, ponieważ tak nie jest zawierają ukośniki w zmiennej. Wszystkie odpowiedzi używają '/' jako separatora. Oczywiste rzeczy, wiem, ale zostawiają miejsce na lepsze (podwójne) pytanie. – devnull

+0

Możliwy duplikat [zmiennych powłoki w skrypcie sed] (http://stackoverflow.com/questions/7006910/shell-variables-in-sed-script) –

Odpowiedz

68

Say:

sed "s|\$ROOT|${HOME}|" abc.sh 

Uwaga:

  • Użyj podwójnych cudzysłowów, aby sed rozwinąć zmienne.
  • Użyj separatora inny niż / ponieważ wymiana zawiera /
  • Ucieczka $ we wzorcu, ponieważ nie chcą uciec.

EDIT: Aby zastąpić wszystkie wystąpienia $ROOT, powiedzmy

sed "s|\$ROOT|${HOME}|g" abc.sh 
14

To może pracować dla Ciebie:

sed 's|$ROOT|'"${HOME}"'|g' abc.sh > abc.sh.1