如何在sed的s替换命令中处理包含/字符的变量值?
sed替换含斜杠内容时报错解决方案
错误原因
sed的s替换命令默认使用/作为分隔符,当替换变量中包含/字符时,sed会将变量内的/误判为命令分隔符,打乱了s/old/new/g的结构,最终抛出unknown option to 's'错误。
解决方案
方案1:更换s命令的分隔符(最简便)
sed的s命令支持自定义分隔符,只要选择一个替换目标和替换内容中都不存在的字符作为分隔符即可,常用的可选分隔符有|、#、@等。
针对你的场景,修改命令如下即可正常执行:
filename="mongo-template.txt" serviceendpoint="https://test-in.mydomain.com/api/users" sed "s|SERVICE-ENDPOINT|$serviceendpoint|g" "$filename"
如果需要直接修改原文件,GNU sed(常见于Linux系统)可加-i参数:
sed -i "s|SERVICE-ENDPOINT|$serviceendpoint|g" "$filename"
macOS自带的sed需要加-i ''参数:
sed -i '' "s|SERVICE-ENDPOINT|$serviceendpoint|g" "$filename"
方案2:对变量内的斜杠做转义
如果无法找到合适的自定义分隔符,可提前对变量中的/做转义处理,将所有/替换为\/:
escaped_serviceendpoint=$(printf '%s\n' "$serviceendpoint" | sed 's/[\/&]/\\&/g') sed "s/SERVICE-ENDPOINT/$escaped_serviceendpoint/g" "$filename"
内容的提问来源于stack exchange,提问作者user1346346
相关产品推荐
相关产品推荐

