我有以下代码
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之间差异的网站,但我无法弄清楚这一点。
答案 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知道它所在的文件的方法。正在努力。