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

hhh*_*hhh 43 sed

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

remove
keep
remove
keep
remove
...
Run Code Online (Sandbox Code Playgroud)

gho*_*g74 68

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

sed -n '1~2!p' file
Run Code Online (Sandbox Code Playgroud)

这意味着,从第1行开始,在步骤2中,打印所有其他行.

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

sed '1~2d'
Run Code Online (Sandbox Code Playgroud)

它也可以使用awk完成:

awk 'NR%2==0' file
Run Code Online (Sandbox Code Playgroud)

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

  • 当我在macos上尝试使用sed时,我收到错误"无效的命令代码〜". (3认同)
  • 不带感叹号:_打印奇数行:_ `sed -n '1~2p' file` ,_打印偶数行:_ `sed -n '0~2p' file`。 (2认同)

Pau*_*ce. 36

这是我能想到的最短的:

sed -n 'g;n;p' file
Run Code Online (Sandbox Code Playgroud)

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

  • @Nagel:尝试:`sed -n'p; n'file`或`sed'n; d'file`输出奇数行.顺便说一下,我认为输出偶数行不需要`g`:`sed -n'n; p'file`似乎有效. (11认同)
  • 这也适用于OS X!(与`sed -n'1~2!p'`不同.)它需要2,4,6行...,我无法从手册页中弄清楚如何使用1,3,5行,...但是,添加第一行是一个简单的黑客行为. (3认同)

小智 6

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

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

sed -n ’n;p’ file
Run Code Online (Sandbox Code Playgroud)

可能看起来有些混乱,所以下面是逐步进行的操作:

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

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

sed -n ‘p;n’ file
Run Code Online (Sandbox Code Playgroud)

这是算法背后发生的事情:

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


Chr*_*nat 5

Perl解决方案:

perl -ne 'print if $. % 2 == 0' file
Run Code Online (Sandbox Code Playgroud)

$. 是行号

  • 我回答是因为 sed、awk 和 perl 通常可以互换使用。虽然在速度和简单性方面存在差异,但它们都用于命令行或 shell 脚本内部。 (2认同)