我正在使用以下代码替换shell脚本中的字符串。
echo $LINE | sed -e 's/12345678/"$replace"/g'
但它已被替换为$replace
而不是该变量的值。
有人能告诉我出了什么问题吗?
Answers:
如果要解释$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
(如/
例如),因为它会造成混乱,除非逃脱。但是,正如您所说,如果您要用另一个替换一个数字,那应该不是问题。
set
也没有必要(无论如何,您将如何使用它?)。只是replace=987654321
。
export
确保为孩子设置变量,但是,正如您所说,您可以很容易地避免使用它。但是,export
此处的使用与否无关(样式问题),并且对实际答案(即如何在sed
命令中使用变量)没有影响。
-i
选件。你知道为什么吗?或如何使其工作?
$
或`
在sed
脚本用反斜杠进行转义,以保护它从外壳的替代机制为双引号字符串。
您可以使用外壳程序(bash / ksh)。
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
/bin/sh
在许多现代Linux 上的破折号上也失败了。
并非特定于该问题,而是针对那些需要相同功能的人,以便从先前的答案中清楚地了解:
# 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
我更喜欢使用双引号,因为如果不能更改其中的任何内容或无法调用变量替换,则单方quptes就像我们使用它们一样非常强大。
因此请使用双引号。
echo $LINE | sed -e "s/12345678/$replace/g"