sed抱怨bash脚本中的数字

时间:2016-04-21 11:28:55

标签: bash sed sh

我正在编写一个脚本来将dafault配置值替换为用户指定的值。但我从sed得到了未终结的'命令错误。经过2小时的谷歌搜索后,我仍然没有弄清楚是什么导致了这一点。这些行是:

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中没有经常使用。

2 个答案:

答案 0 :(得分:3)

您需要引用变量。请注意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,这将删除所有不是字母数字或空格的字符。

答案 1 :(得分:0)

问题来自bash引用。

你应该使用

sed -i "s/localhost/${CONFIG_GMETAD_COMPUTENODES}/g"