sed Linux 与 FreeBSD

sed on Linux vs FreeBSD

我有以下代码

cat file1 | sed '0,/2014-08-30/d'

file1里面有

2014-08-30
2015-03-29 + /homes/eva/xv/xvalen20/aaa
2015-03-29 + /homes/eva/xv/xvalen20/IZP/blabla
2015-03-29 + /homes/eva/xv/xvalen20/IZP/wg*d s1a
2015-03-29 + /homes/eva/xv/xvalen20/IZP/wg*ds1a
2015-03-29 + /homes/eva/xv/xvalen20/newfile
2015-03-29 + /homes/eva/xv/xvalen20/wgdsa

在 Linux 机器上,输出与 file1 相同,除了第一行(这就是我的目标)。在 FreeBSD 机器上,输出与 file1 的内容完全相同。

我找到了一些关于 seds 之间差异的网站,但我搞不懂这个。

BSD sed 发现于 Mac OS X 也不喜欢 0 行号。

解决方法:

(echo "Hello"; cat file) | sed '1,/2014-08-30/d'

这会给出包含您要删除的 Hello 的第 1 行,并在包含 2014-08-30 的行之后停止删除。它对 sed.

的 GNU 和 BSD 版本同样适用

是的,这是关于 BSD sed 的许多烦人的事情之一。

您可能要考虑使用 awk 而不是 sed,因为它没有这个问题:

awk 'NR == 1, /2014-08-30/ { next } 1' file

如果你想用 sed 来做,@JonathanLeffer 的变通方法是一种直接且在许多情况下很实用的解决问题的方法。不幸的是,它失去了就地编辑文件的能力。如果这对您来说不是问题,请查看他的回答。如果是,

sed -i.bak '/2014-08-30/ { x; d; }; x; /./! { x; d; }; x' file

也有效。它更复杂(基本上它在第一次找到结束模式时在保持缓冲区中设置一个标志,并且仅在检查它是否已设置后才打印行),但这是一种让 sed 知道它所在的文件的方法正在工作。