2013-10-03 40 views
34

我有abc.sh如何在sed中的命令中使用变量?

exec $ROOT/Subsystem/xyz.sh 

在UNIX系统中,如果我打印echo $HOME然后我得到/HOME/COM/FILE

我想使用sed替换$ROOT$HOME

预期输出:

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

我试过了,但我没有得到预期的输出:

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

增加:

如果我有abc.sh

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

然后用

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

它仅更换第一$ROOT,即,输出即将作为

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

的可能重复[替换shell脚本的字符串(HTTP ://stokesoverflow.com/questions/3306007/replace-a-string-in-shell-script) – tripleee

+3

@tripleee虽然我确信这将是许多其他问题的副本,不是最好的,因为它没有在变量中包含斜杠。其中的所有答案都使用'/'作为分隔符。明显的东西,我知道但留下更好的(重复)问题的空间。 – devnull

+0

在[sed脚本中的shell变量]可能重复(http://stackoverflow.com/questions/7006910/shell-variables-in-sed-script) –

回答

68

说:

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

注:

  • 使用双引号,以便sed可以扩展变量。
  • 因为更换包含/
  • 在模式逃离$因为你不想逃避它使用比/不同的分隔符。

编辑:为了取代$ROOT所有出现,说

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

这可能会为你工作:

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