macOS下bash脚本sed替换行参数时出现P命令末尾多余字符报错
报错根源拆解
- 触发该报错的核心原因完全来自sed编辑规则的语法格式错误,macOS自带的是BSD版sed,对语法的严格度高于Linux下的GNU sed
- 规则字符串开头的多余空格+缺失正则定界符,直接触发命令识别错误
你写在单引号里的编辑规则,开头第一个字符就是空格。BSD sed解析编辑规则时,会自动跳过规则开头的空白字符,把后续第一个非空白字符当成内置命令的首字母——这里第一个非空白字符就是PrimaryGenerator的首字母P,对应sed的大写P打印命令。因为你从头到尾没有给要匹配的目标字段加包裹用的正则定界符(比如斜杠/),sed根本没把那段长路径识别成“需要匹配的行地址”,反而把后面跟着的所有文本都当成P命令的多余参数,最终抛出extra characters at the end of P command的报错。 - 替换段的语法也不符合BSD sed要求
就算没有上面的解析错误,你写的s 90.000000 0.0格式也不合法。BSD sed要求s替换命令必须紧跟一个定界符,不能直接用普通空格作为参数分隔;同时带行匹配的替换逻辑,必须把行匹配规则和s命令做正确的语法分隔,不能裸把匹配文本和s命令用空格隔开。
- 规则字符串开头的多余空格+缺失正则定界符,直接触发命令识别错误
- 额外注意:直接在匹配到的行里全局替换90.000000为0.0存在误替换风险,如果同一行内有其他位置出现90.000000的参数值,会被一起修改。
可正常运行的兼容命令
实现“仅修改包含PrimaryGenerator/EnergySampler/Fixed/Energy字段行内的90.000000值为0.0”需求的macOS原生sed命令为:
sed -i '' '/PrimaryGenerator\/EnergySampler\/Fixed\/Energy/ s/90\.000000/0.0/' benchmark_cube_saphir_attenuation.txt
语法说明
- 用斜杠作为正则定界符包裹匹配的目标字段,字段名本身包含的路径斜杠需要加反斜杠转义,避免和定界符冲突
- s命令紧跟匹配地址之后,s后面同样用斜杠作为定界符分隔待替换值和目标值,待替换值里的小数点转义,避免被正则识别为任意单字符匹配规则
- macOS下的
-i参数需要紧跟一个空字符串作为“备份文件后缀”的占位,这部分你原命令的写法是对的,不需要调整
内容的提问来源于stack exchange,提问作者SoleGoodman
相关产品推荐
相关产品推荐

