Mac环境下Shell脚本修改grafana.yaml回滚时sed报错求助
解决Mac下sed -i报错的问题
核心原因
Mac自带的是BSD sed,和Linux常用的GNU sed语法差异明显,尤其是-i(原地编辑)参数的要求:
- GNU sed可直接用
sed -i 's/xxx/yyy/' file - BSD sed要求
-i后必须指定备份文件后缀(空后缀也需明确写),且格式严格:sed -i '' 's/xxx/yyy/' file
排查修复要点
如果已经尝试加空参数仍报错,检查以下几点:
- 参数顺序错误:BSD sed要求
-i ''必须紧跟sed命令,-i和空引号之间要有空格。错误写法:sed -i'' 's/.../' grafana.yaml;正确写法:sed -i '' 's/.../' grafana.yaml - 文件路径问题:确认
grafana.yaml在脚本执行的当前目录,或直接写绝对路径(比如./grafana.yaml)避免路径识别错误 - 替换表达式转义问题:如果替换内容含
/、&这类特殊字符,要么转义,要么换用其他分隔符(比如#),示例:sed -i '' 's#old_text#new_text#' grafana.yaml
针对你场景的示例代码
假设要修改assumeRoleArn和defaultRegion后回滚,正确BSD sed写法如下:
# 修改前先备份原文件(推荐,避免回滚无依据) cp grafana.yaml grafana.yaml.bak # 修改字段(无备份写法:把'.bak'换成'') sed -i '.bak' 's/assumeRoleArn: .*/assumeRoleArn: arn:aws:iam::123456789012:role/YourRole/' grafana.yaml sed -i '.bak' 's/defaultRegion: .*/defaultRegion: us-east-1/' grafana.yaml # 完成操作后回滚 mv grafana.yaml.bak grafana.yaml
替代方案:用GNU sed
如果不想纠结BSD sed语法,可通过Homebrew安装GNU sed(命名为gsed):
brew install gnu-sed
之后就能用和Linux一致的语法:
gsed -i 's/assumeRoleArn: .*/assumeRoleArn: new_value/' grafana.yaml
内容的提问来源于stack exchange,提问作者abhishek__
相关产品推荐
相关产品推荐

