sed on Linux vs FreeBSD

时间:2015-03-29 20:35:50

标签: linux bash sed 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之间差异的网站,但我无法弄清楚这一点。

2 个答案:

答案 0 :(得分:4)

在Mac OS X上找到的BSD sed也不喜欢0行号。

解决方法:

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

这会提供包含您要删除的Hello的第1行,并在包含2014-08-30的行后停止删除。对于sed的GNU和BSD版本,它的工作方式相同。

答案 1 :(得分:1)

是的,这是关于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知道它所在的文件的方法。正在努力。