使用变量替换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"