如何保留某些行号并删除其余行号

How to keep certain line numbers and delete the rest

使用 sed 我知道如何删除某些行号,例如

sed -i.bak -e '6d;8d;15d;' file

如何实现它的逆向。我想保留这些行并删除其余部分。我想就地执行此操作,因为我有大量文件并且我会将其用作更大脚本的一部分。我仍在保留备份,因为我不想弄乱我的原始数据集。

如何停止 sed 的打印,然后提及要打印这些行的位置。

sed -i.bak -n '6p;8p;15p;' Input_file

来自man sed

   -n, --quiet, --silent

          suppress automatic printing of pattern space

   p      Print the current pattern space.

RavinderSingh13 的解决方案很好,使用 sed-n 标志来抑制模式 space 的自动打印。如果不想使用该标志,可以使用标签和 sed-goto 语句:

sed '6b;8b;15b;d;' file

这基本上说明:

  • 6b如果我在第6行,分支到最后
  • 8b如果我在第8行,分支到最后
  • 15b如果我在第15行,分支到最后
  • d如果我还没有分支,删除模式space并开始下一个循环

在这种情况下,与 -n 标志的用法相反,模式 space 总是在循环结束时打印。

如果你想使用awk,你可以这样做:

awk '(FNR==6) || (FNR==8) || (FNR==15)' file

还有:

sed -e '6!{8!{15!d;};}'