2014-10-04 65 views
1

我想:使用SED替代与一个bash变量

sed -i s/installpath/"$INSTALL_PATH"/ /tmp/myscript.conf 

当$ INSTALL_PATH只是一个字符串一切正常。但如果安装路径是实际路径(我猜是'/'字符是问题),比如/ home/ubuntu/install_script。然后,它断开与以下错误消息:

的sed:-e表达#1,炭16:未知的选项为`S'

顺便说一句:我尝试没有 “”大约$ INSTALL_PATH。没有工作

感谢您的帮助!

回答

3

$INSTALL_PATH很可能包含斜杠,这意味着它们将被sed解释为s/pattern/replacement/构造的一部分。为了避免这种情况,你应该使用不同的分隔符,例如~

sed -i "s~installpath~$INSTALL_PATH~" /tmp/myscript.conf 

我也用引号引用,而不是引用一个部分在整个SED线。一般来说,这样做是个好主意,因为它可以防止shell解释其他字符。通常使用单引号,但如果要扩展shell变量,请使用双引号。

3

您不必使用/作为sed命令的分隔符。如果你小心地使用引号,你可以使用其他字符,甚至是不太可能的文件名中存在

sed -i s^installpath^"$INSTALL_PATH"^ /tmp/myscript.conf 

sed -i "s|installpath|$INSTALL_PATH|" /tmp/myscript.conf 

使用的东西,那是不太可能的文件名出现,如这条管道在Windows路径中是完全违法的,在Linux上它是一个非常糟糕的主意,不太可能在野外发生。