简介

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 后,利用别名、环境变量、配置文件等方式调用是更好的一种方法,当然,这个根据个人需求决定就好了。