sed命令变量替换失效求助:嵌入$escaped_password时执行失败
解决sed命令"unterminated command `s'"错误
问题原因
你的sed命令报错是因为$escaped_password中包含了sed默认的分隔符/,导致s命令的格式被破坏。比如密码是abc/def时,sed会把命令解析为s/password:/password: abc/def/,这里第三个/会被当成命令结束符,后面的def/就成了无效内容,触发未终止的命令错误。
解决方案
方法1:更换sed的分隔符
sed允许使用任意非空白字符作为s命令的分隔符,比如用#或|,只要密码里不包含这个字符就行:
sed -i "s#password:#password: $escaped_password#" "$file"
如果密码可能包含多种符号,可以选一个不太常见的分隔符,比如@:
sed -i "s@password:@password: $escaped_password@" "$file"
方法2:用awk替代sed(更可靠)
awk处理变量时不需要担心分隔符冲突,直接通过-v参数传入变量,用sub函数完成替换:
awk -v new_pass="$escaped_password" '/password:/ {sub(/password:/, "password: " new_pass)} 1' "$file" > temp_file && mv temp_file "$file"
这个方法不管密码里有什么特殊字符都能正常工作,避免了转义的麻烦。
方法3:正确转义密码中的分隔符
如果你坚持用sed,需要把密码中所有的分隔符(比如默认的/)转义成\/。可以用bash的参数替换来完成:
escaped_pass_for_sed="${escaped_password//\//\\/}" sed -i "s/password:/password: $escaped_pass_for_sed/" "$file"
但这种方式需要针对每个可能的分隔符做转义,不如前两种方法省心。
内容的提问来源于stack exchange,提问作者aurelianr
相关产品推荐
相关产品推荐

