macOS下sed原地编辑选项顺序为何与手册描述不符?
为什么macOS上按sed手册顺序写的命令会报错?
问题背景
在基于FreeBSD的macOS 12系统中,按照手册给出的语法sed [-Ealnru] command [-I extension] [-i extension] [file ...]编写命令sed -E '/^A/d' -i '' tmp.txt时,会报错sed: -i: No such file or directory且文件未修改;但将命令调整为sed -E -i '' '/^A/d' tmp.txt就能正常执行。
原因解析
FreeBSD系的sed(macOS默认使用的版本)对参数的解析逻辑和GNU sed不同,它要求所有选项(包括-i)必须放在command(即编辑指令,比如你的/^A/d)之前。
错误命令的问题
执行sed -E '/^A/d' -i '' tmp.txt时,sed会按以下逻辑解析参数:
-E:正确识别为启用扩展正则表达式的选项/^A/d:被判定为要执行的编辑命令-i:被当作需要处理的目标文件名,而系统中不存在名为-i的文件,因此抛出“找不到文件”的错误
正确命令的逻辑
sed -E -i '' '/^A/d' tmp.txt的参数解析逻辑:
-E:启用扩展正则表达式的选项-i '':正确识别为“直接修改原文件,不生成备份文件”的选项/^A/d:要执行的编辑命令tmp.txt:目标文件,sed正常执行编辑指令并修改文件
额外说明
手册给出的语法表述存在一定歧义,实际使用时需要注意:FreeBSD sed的所有选项参数都要放在编辑命令之前;而GNU sed对选项和命令的顺序限制更宽松,这也是跨平台使用sed时容易遇到的差异点。
内容的提问来源于stack exchange,提问作者Mehrshad Khansarian
相关产品推荐
相关产品推荐

