使用变量替换shell脚本中的字符串

我使用下面的代码来替换shell脚本中的字符串。

echo $LINE | sed -e 's/12345678/"$replace"/g' 

但是它正在被替换为$replace而不是该变量的值。

有谁可以告诉出了什么问题?

如果要解释$replace ,则不应使用单引号,因为它们会阻止变量替换。

尝试:

 echo $LINE | sed -e "s/12345678/\"${replace}\"/g" 

假设你想要报价。如果你想要报价,使用:

 echo $LINE | sed -e "s/12345678/${replace}/g" 

成绩单:

 pax> export replace=987654321 pax> echo X123456789X | sed "s/123456789/${replace}/" X987654321X pax> _ 

只要注意确保${replace}sed没有任何重要的字符(比如/比如),因为除非被转义,否则会引起混淆。 但是,如果像你所说的那样,用另一个数字取代一个数字,这应该不成问题。

你可以使用shell(bash / ksh)。

 $ var="12345678abc" $ replace="test" $ echo ${var//12345678/$replace} testabc 

单引号非常强大。 一旦进入,你就无法调用变量替换,直到你离开。 使用双引号代替:

 echo $LINE | sed -e "s/12345678/$replace/g" 

这个问题并不是特定的,但是对于那些需要为以前的答案清晰起见而扩展的功能的人来说:

 str="someFileName.foo" find=".foo" replace=".bar" result=${str//$find/$replace} echo $result # result is: someFileName.bar str="someFileName.sally" find=".foo" replace=".bar" result=${str//$find/$replace} echo $result # result is: someFileName.sally because ".foo" was not found 
 echo $LINE | sed -e 's/12345678/'$replace'/g' 

你仍然可以使用单引号,但是当你想在正确的位置展开变量时,你必须“打开”它们。 否则字符串是“字面意思”(正如@paxdiablo正确表示,他的答案也是正确的)

为了让你的shell扩展变量,你需要使用双引号

 sed -i "s#12345678#$replace#g" file.txt 

如果$replace包含特殊的sed字符( #\ ),这将会中断。 但是你可以预处理$replace来引用它们:

 replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g') sed -i "s#12345678#$replace_quoted#g" file.txt 

改用这个

 echo $LINE | sed -e 's/12345678/$replace/g' 

这对我的作品只是简单地删除引号

我更喜欢使用双引号,因为单个quptes是非常强大的,因为我们使用它们,如果不能改变它里面的任何东西或者可以调用变量substituion。

所以使用双引号instaed。

 echo $LINE | sed -e "s/12345678/$replace/g"