sed 抱怨 bash 脚本中的数字
sed complains on numbers in bash script
我正在编写一个脚本来将默认配置值替换为用户指定的配置值。但是我从 sed 得到未终止的 's' 命令错误。经过 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。
您需要引用您的变量。注意 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 ]/}"
这将去除所有非字母数字或 space 的字符,如果 bash 是您的 shell。
问题来自 bash 中的引用。
你应该使用
sed -i "s/localhost/${CONFIG_GMETAD_COMPUTENODES}/g"
我正在编写一个脚本来将默认配置值替换为用户指定的配置值。但是我从 sed 得到未终止的 's' 命令错误。经过 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。
您需要引用您的变量。注意 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 ]/}"
这将去除所有非字母数字或 space 的字符,如果 bash 是您的 shell。
问题来自 bash 中的引用。
你应该使用
sed -i "s/localhost/${CONFIG_GMETAD_COMPUTENODES}/g"