sed报错:-e表达式`s`选项未知,求助排查EC2用户数据脚本问题
关于sed命令替换报错的排查与解决
问题场景
在EC2启动模板的Base64编码用户数据bash脚本中使用了以下sed命令:
sed -i -- "s/{{ data_dir }}/$${CONSUL_DATA_DIR////\/}/g" $CONSUL_DEFAULT_CONFIG
实例创建时触发报错:
sed: -e expression #1, char 39: unknown option to `s'
错误原因
sed的s替换命令默认用/作为分隔符,当CONSUL_DATA_DIR变量的值包含路径类的/字符时,你当前的转义方式$${CONSUL_DATA_DIR////\/}并没有彻底解决问题——转义后的结果里依然存在/,会被sed误判为s命令的额外分隔符,直接破坏了命令的语法结构,导致识别到非法选项。
举个例子:如果CONSUL_DATA_DIR=/opt/consul/data,转义后会变成\/opt\/consul\/data,代入sed命令后表达式变为s/{{ data_dir }}/\/opt\/consul\/data/g,sed解析时会把这些转义后的/当成新的分隔符,进而报错。
解决方法
方法1:更换sed分隔符(推荐)
改用不会出现在CONSUL_DATA_DIR值里的字符作为s命令的分隔符,比如#或|,这样无需转义变量中的/:
sed -i -- "s#{{ data_dir }}#$CONSUL_DATA_DIR#g" $CONSUL_DEFAULT_CONFIG
方法2:正确转义变量中的/
如果坚持使用/作为分隔符,需要把变量里的每个/替换成\/,用bash参数替换实现:
ESCAPED_DATA_DIR=${CONSUL_DATA_DIR//\//\\/} sed -i -- "s/{{ data_dir }}/$ESCAPED_DATA_DIR/g" $CONSUL_DEFAULT_CONFIG
内容的提问来源于stack exchange,提问作者Booboo
相关产品推荐
相关产品推荐

