使用带有bash变量的sed替换

时间:2014-10-04 11:10:48

标签: bash sed

我试图:

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

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

  
    

sed:-e表达式#1,字符16:对于s'

的未知选项   
顺便说一下:我试过没有""在$ INSTALL_PATH附近。没有工作

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

您不必在sed命令中使用/作为分隔符。使用在文件名中不太可能出现的内容,例如:

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

如果你小心引用,你可以使用文件名中更不可能存在的其他字符:

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

管道在Windows路径中是完全非法的,在Linux上它是一个非常糟糕的主意,并且不太可能在野外发生。