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

时间:2010-07-22 05:28:31

标签: unix shell sed

我使用以下代码替换字符串 在shell脚本中。

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

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

有人可以说出了什么问题吗?

12 个答案:

答案 0 :(得分:109)

如果您想解释$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(例如/),因为除非转义,否则会引起混淆。但是,正如你所说,如果你用一个数字替换另一个数字,这应该不是问题。

答案 1 :(得分:61)

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

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

答案 2 :(得分:11)

不是问题的具体问题,但是对于那些需要扩展相同功能的人来说,以前的答案是清晰的:

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

答案 3 :(得分:5)

单引号非常强大。进入内部后,在离开之前,您无法调用变量替换。改为使用双引号:

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:1)

To let your shell expand the variable, you need to use double-quotes like

~/.profile

This will break if launchctl setenv PATH $PATH contain special System.getenv("PATH") characters (sed -i "s#12345678#$replace#g" file.txt , $replace). But you can preprocess sed to quote them:

#

答案 6 :(得分:1)

找到了graceful solution

echo ${LINE//12345678/$replace}

答案 7 :(得分:0)

我对此有类似的要求,但是我的replace var包含一个&符。这样逃避“&”号解决了我的问题:

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

答案 8 :(得分:0)

与问题无关,但是如果有人将字符串作为传递,这可能会有帮助。

使用:

./bash_script.sh "path\to\file"

代替:

./bash_script.sh path\to\file

针对您的reference

答案 9 :(得分:0)

让我给你举两个例子。

  • 使用 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

希望对您有所帮助!

答案 10 :(得分:-1)

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

所以请使用双引号instaed。

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

答案 11 :(得分:-1)

改为使用

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

这对我有用,只需删除引号

即可