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

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

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

但是它被 $replace代替了变量的值。

有人知道哪里出了问题吗?

553178 次浏览

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

试试:

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

翻译:

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

只是要小心确保 ${replace}没有任何对 sed有重要意义的字符(例如 /) ,因为除非转义,否则它将导致混淆。但是,如果像你说的,你用一个数字替换另一个数字,那应该不是问题。

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

您仍然可以使用单引号,但是当您希望变量在正确的位置展开时,必须“打开”它们。否则字符串将被“逐字”处理(正如@paxDiablo 所正确陈述的那样,他的答案也是正确的)

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

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

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

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

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

所以要用双引号。

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

要让 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

不是针对这个问题,而是针对那些需要相同功能的人们,他们需要从以前的答案中扩展相同的功能:

# create some variables
str="someFileName.foo"
find=".foo"
replace=".bar"
# notice the the str isn't prefixed with $
#    this is just how this feature works :/
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'

这对我来说很有用,只要删除引号就行了

找到一个 优雅的解决方案

echo ${LINE//12345678/$replace}

我对此也有类似的需求,但是我的替换变量包含一个与号。像这样逃离 & 符号解决了我的问题:

replace="salt & pepper"
echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"

我给你们举两个例子。

  • 使用 sed:
#!/bin/bash
LINE="12345678HI"
replace="Hello"
echo $LINE | sed -e "s/12345678/$replace/g"
  • 不使用 sed:
LINE="12345678HI"
str_to_replace="12345678"
replace_str="Hello"
result=${str//$str_to_replace/$replace_str}
echo $result

希望对你有所帮助!