macOS Monterey下sed使用含特殊字符路径变量报错的解决方法
问题核心原因
sed的s替换命令默认将/作为语法分隔符,当传入的替换内容(即用户输入的绝对路径PATH_VAR)本身包含/时,sed会将路径内的/误识别为命令分隔符,最终触发命令解析报错。
解决方案
你可以选以下任意一种方案实现需求,都不需要手动转义路径:
方案1:自动转义路径内的斜杠
利用zsh内置的参数扩展能力,在传入sed前自动给变量内所有/添加转义前缀,不需要依赖外部命令:
#!/bin/zsh read PATH_VAR # 全局替换PATH_VAR内的/为\/,完成自动转义 ESCAPED_PATH=${PATH_VAR//\//\\/} sed -i "" "s/\"PATH_VAR=.*\"/\"PATH_VAR=$ESCAPED_PATH\"/" file.txt
语法说明:${变量//匹配内容/替换内容}是zsh原生支持的全局字符串替换语法,执行效率高于调用sed/awk等外部命令处理转义。
方案2:更换sed替换命令的分隔符(更推荐)
sed的s命令不强制要求使用/作为分隔符,你可以选择一个不会出现在文件路径内的字符作为分隔符(比如#、|、@,其中#是处理路径场景最常用的选择,因为合法文件路径不会包含#字符),从根源上避免斜杠冲突,不需要做任何转义处理,代码更简洁:
#!/bin/zsh read PATH_VAR # 用#替代/作为sed替换的分隔符 sed -i "" "s#\"PATH_VAR=.*\"#\"PATH_VAR=$PATH_VAR\"#" file.txt
注意:你当前脚本中
sed -i ""的写法是macOS自带BSD sed的正确写法,作用是原地修改文件不生成备份,不需要调整。如果后续在Linux环境(使用GNU sed)运行,去掉-i后面的空字符串""即可。
内容的提问来源于stack exchange,提问作者comws
相关产品推荐
相关产品推荐

