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 知道它所在的文件的方法正在工作。
我有以下代码
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
.
是的,这是关于 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 知道它所在的文件的方法正在工作。