macOS 15.0.1下sed命令报错:unterminated substitute pattern
macOS 15.0.1下sed命令随机报错问题解决
首先明确:macOS自带的是BSD sed,和你之前长期使用的GNU sed存在语法差异,系统更新后BSD sed的行为校验更严格,导致原命令触发错误。
问题根源
你用的sed -i 's/--.*//g' sr-api/*.sql是GNU sed的写法,BSD sed对-i选项的要求更苛刻——必须明确指定备份后缀(哪怕不需要备份文件,也要加空字符串)。另外,系统更新后,BSD sed对文件名通配符展开后的处理逻辑调整,哪怕目标文件没有注释,也会因命令格式不兼容抛出“未终止替换模式”的错误。
修复方案
方案1:适配BSD sed语法
直接修改命令,给-i加上空备份后缀(注意空字符串和单引号之间不能有空格):
sed -i '' 's/--.*//g' sr-api/*.sql
这个写法同时兼容GNU sed,改完后跨平台也能正常运行。
方案2:改用GNU sed替代BSD版本
如果更习惯GNU sed的语法逻辑,可以通过Homebrew安装:
brew install gnu-sed
安装后用gsed执行原命令:
gsed -i 's/--.*//g' sr-api/*.sql
也可以给gsed设置别名,直接用sed调用:
# zsh用户执行 echo 'alias sed=gsed' >> ~/.zshrc && source ~/.zshrc # bash用户执行 echo 'alias sed=gsed' >> ~/.bashrc && source ~/.bashrc
额外说明
报错里的“unterminated substitute pattern”本质是BSD sed解析命令时,因-i选项格式不符合要求,误判了替换模式的边界,和目标文件是否包含注释无关。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

