mac 上使用字符串处理神器 sed 的正确姿势
简介
sed是shell中字符串处理的三大神器之一,利用sed进行字符串处理对从事Linux相关职业的人来说是必不可少的,但是在mac上的sed与Linux的sed是有一定区别的,为什么呢,因为mac实质上和Linux就是不一样的,尽管其中很多基本命令是通用的,例如ls、cd、pwd等。mac是unix内核,是基于FreeBSD的,而我们常用的Linux如Ubuntu、CentOS等是Linux内核。
sed的不同
非常大的一个坑就是sed命令的不统一,Linux的sed是基于GNU的sed,而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
这是因为xnu的sed命令用法不同于gnu,具体可以通过下面的命令查看sed命令手册
$ man sed

那么我想用我习惯的Linux的GNU-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,我个人不是很推荐这种方式,不是说不好,而是当我们的机器不只是一个人用,是做服务器用的,或者有一些我们正在用的脚本里面有xnu的sed调用,那么这种方式就会造成一些问题,所以我个人认为安装了gnu-sed后,利用别名、环境变量、配置文件等方式调用是更好的一种方法,当然,这个根据个人需求决定就好了。

