macos上面sed命令与GNU的sed的不同之处

做项目的时候,需要写一个shell脚本,其中有一个功能需要删除文件中的带有特定内容的行,sed命令可以完成这个功能。在网上查找教程时,写法是

sed -i '/123/d' target_file

这样就可以将target_file中包含123的行删除掉。

但是在公司的mac上面,按照这个方法写,便会报错:

sed: 1: "target_file": undefined label 'arget_file'

一开始以为是教程有问题,查找了多个教程之后,发现写法都一样,教程本身并不存在问题。最后在stackoverflow上面找到了相同的问题。macos的sed与gnu linux上面的sed本身就存在差别,macos上面的sed -i传参时,需要紧跟一个参数,作为备份文件的后缀,例如:

sed -i .bak '/123/d' target_file

在mac上面可以正常运行,源文件target_file中包含123的行将会被删除,同时生成一个备份文件target_file.bak保存修改前的文件内容。如果不需要备份,可以传空参数如下:

sed -i '' '/123/d' target_file

这样就完成了和gnu上面的sed -i相同的功能。

另外的一种解决方法是可以在mac上使用homebrew安装gnu版本的sed,并且使用alias替换,就可以与服务器保持一致,具体操作方法为:

brew install gnu-sed
alias sed=gsed