简介

sedshell中字符串处理的三大神器之一,利用sed进行字符串处理对从事Linux相关职业的人来说是必不可少的,但是在mac上的sedLinuxsed是有一定区别的,为什么呢,因为mac实质上和Linux就是不一样的,尽管其中很多基本命令是通用的,例如lscdpwd等。macunix内核,是基于FreeBSD的,而我们常用的LinuxUbuntuCentOS等是Linux内核。

sed的不同

非常大的一个坑就是sed命令的不统一,Linuxsed是基于GNUsed,而FreeBSD中的sed则是基于XNU的,其用法有些不同,下面会做对比简要说明。

拿最常用的追加行来说,我们假设一个场景,我需要对test.txt文件实时写入,在文件第二行添加1234,文件初始内容如下所示

$ cat test.txt
3333
1112
3333
test
4444
5555

Linux下,我们只需要执行下面的命令即可实现追加

$ sed -i -e '1a\1234' test.txt

但是在mac下这条命令会报错如下

sed: 1: "1a\1234": extra characters after \ at the end of a command

这是因为xnused命令用法不同于gnu,具体可以通过下面的命令查看sed命令手册

$ man sed

那么我想用我习惯的LinuxGNU-sed怎么解决呢,我们可以安装gnu-sed来代替系统内的sed,具体方法如下

首先我们需要Homebrew包管理器

$ /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/Homebrew/install/master/install)"

然后,通过brew来安装gnu-sed

$ brew install gnu-sed

默认brew会将gnu-sed安装到/usr/local/Cellar/目录下,这时我们就可以利用gsed来执行了

$ gsed -i -e '1a\1234' test.txt

如果提示命令找不到的话,只需要将下面的路径添加到PATH环境变量就可以了

/usr/local/Cellar/gnu-sed/4.5/bin/

或者将/usr/local/Cellar/gnu-sed/4.5/bin/gsed添加别名都可以。

网上也有人用下面的命令安装

$ brew install gnu-sed --with-default-names

貌似这种方式直接替代了系统内的sed,我个人不是很推荐这种方式,不是说不好,而是当我们的机器不只是一个人用,是做服务器用的,或者有一些我们正在用的脚本里面有xnused调用,那么这种方式就会造成一些问题,所以我个人认为安装了gnu-sed后,利用别名、环境变量、配置文件等方式调用是更好的一种方法,当然,这个根据个人需求决定就好了。