sed抱怨bash脚本中的数字

sed抱怨bash脚本中的数字,bash,sed,sh,Bash,Sed,Sh,我正在编写一个脚本,将dafault配置值替换为用户指定的值。但是我从sed得到了未终止的“s”命令错误。在谷歌搜索了两个小时后,我仍然没有弄清楚是什么导致了这一现象。这些线路是: CONFIG_GMETAD_COMPUTENODES="scccompute1 scccompute2" CONFIG_GMETAD="/etc/gmetad.conf" sed -i 's/localhost/'${CONFIG_GMETAD_COMPUTENODES}'/g' ${CONFIG_GMETAD}

我正在编写一个脚本,将dafault配置值替换为用户指定的值。但是我从sed得到了未终止的“s”命令错误。在谷歌搜索了两个小时后,我仍然没有弄清楚是什么导致了这一现象。这些线路是:

CONFIG_GMETAD_COMPUTENODES="scccompute1 scccompute2"
CONFIG_GMETAD="/etc/gmetad.conf"
sed -i 's/localhost/'${CONFIG_GMETAD_COMPUTENODES}'/g' ${CONFIG_GMETAD}
这代替了

sed -i 's/localhost/scccompute1 scccompute2/g' /etc/gmetad.conf
我犯了一个错误

sed: -e expression #1, char 23: unterminated `s' command

我看不出这里有什么问题,但是没有经常使用sed。

您需要引用您的变量。注意
sed
命令是如何展开的:

sed -i 's/localhost/'scccompute1 scccompute2'/g' /etc/gmetad.conf
这将创建多个选项,而不是sed脚本中的单个选项。相反,请尝试:

sed -i 's/localhost/'"${CONFIG_GMETAD_COMPUTENODES}"'/g' "${CONFIG_GMETAD}"
将变量包含在双引号内会导致整个字符串被视为
sed
的单个参数,这正是您想要的。当然,在文件名周围加引号,因为文件名可能包含特殊字符。通常,在bash中引用变量时,总是引用变量

请注意,如果嵌入变量包含斜杠或其他一些特殊字符,则可能会中断脚本。因此,在将其馈送到
sed
之前,您可能需要进行一些健全性检查:

CONFIG_GMETAD_COMPUTENODES="${CONFIG_GMETAD_COMPUTENODES//[^a-z0-9 ]/}"

如果bash是您的shell,这将删除所有非字母数字或空格的字符。

问题来自bash中的引号

你应该使用

sed-i“s/localhost/${CONFIG\u GMETAD\u COMPUTENODES}/g”

sed-i“s/localhost/${CONFIG\u GMETAD\u COMPUTENODES}/g“${CONFIG\u GMETAD}