如何用sed删除所有其他行?

时间:2010-04-01 12:51:30

标签: sed

如何使用sed删除每个奇数行?

remove
keep
remove
keep
remove
...

5 个答案:

答案 0 :(得分:64)

GNU sed有一个合适的寻址模式:

sed -n '1~2!p' file

表示从第1行开始,在步骤2中,打印所有其他行。

等效地,您可以删除-n,并删除匹配的行:

sed '1~2d'

也可以使用awk:

完成
awk 'NR%2==0' file

(每当行号是2的倍数时,打印行)

答案 1 :(得分:36)

这是我能想到的最短的:

sed -n 'g;n;p' file

它应该适用于非GNU版本的sed(以及GNU sed)。

答案 2 :(得分:4)

Perl解决方案:

perl -ne 'print if $. % 2 == 0' file

$.是行号

答案 3 :(得分:4)

这适用于sed的GNU和BSD(mac)版本:

要删除奇数行(打印偶数行):

sed -n ’n;p’ file

可能看起来有些混乱,所以这是逐步进行的事情:

  1. sed:在第一行读取
  2. -n:禁止输出第一行
  3. n:输出被抑制,所以不要写任何东西
  4. n(再次):将下一行(第二行)读取到模式缓冲区,即立即进行处理
  5. p:打印出模式缓冲区中所有覆盖被抑制的输出的内容,即第二行
  6. sed:在第三行中读取,因为第二行已在step4中通过“ n”得到处理
  7. -n:禁止输出第三行
  8. ...
  9. ...

要删除偶数行(打印奇数行):

sed -n ‘p;n’ file

这是算法内幕发生的事情:

  1. sed:在第一行读取
  2. -n:禁止输出第一行
  3. p:打印模式缓冲区的内容,即第一行,覆盖抑制的输出
  4. n:输出被抑制,所以不要写任何东西
  5. n(再次):从下一行(第二行)读取到模式缓冲区以进行立即处理,但是由于没有更多命令,因此什么也没有发生
  6. sed:在第三行中读取,因为第二行已经在步骤5中通过“ n”得到了“处理”
  7. -n:禁止输出第三行
  8. p:打印覆盖第三行的抑制输出
  9. ...

答案 4 :(得分:2)

还有一个问题:

awk getline file