GVim命令/脚本从一组4中删除行

时间:2017-11-06 19:52:15

标签: unix vim

这篇文章可能算作重复,但我在之前的主题中没有找到任何相关的答案。我有一个大的(6 GB)文本文件,我希望删除一组4行中的每一个第3和第4行。例如,以下

line1
line2
line3
line4
line5
line6
line7
line8

需要转换为此

line1
line2
line5
line6

是否有任何vim脚本/命令删除这些行?它也可以多次通过。 1传递删除第3行(在一组4(第1行,第2行,第3行,第4行))和另一传递删除第3行(先前第4行,在一组3(第1行,第2行,第3行))

命令:g/^/+1 d3接近我想要的但它也删除了第二行。

3 个答案:

答案 0 :(得分:2)

如果你有GNU sed,你可以通过这个管道过滤缓冲区:

sed -e '0~4d' | sed '0~3d'

第一行sed删除第4行,第二行删除第3行。 这具有预期的效果。

要通过此命令管道当前缓冲区,请在命令模式下输入:

%!sed -e '0~4d' | sed '0~3d'

%选择范围的行以传递给命令(%表示所有行,整个缓冲区),!cmd是命令穿过。

要在vim之外执行此操作,请执行以下两个步骤:

sed -ie '0~4d' file
sed -ie '0~3d' file

这将分两步修改文件。

答案 1 :(得分:1)

或者您也可以使用Awk。

awk 'NR%4==3||NR%4==0{next;}1' file.txt > output.txt

通过Vim执行此操作:

%!awk 'NR\%4==3||NR\%4==0{next;}1'

答案 2 :(得分:0)

更新:对于大型文件来说这是一个糟糕的方法,6MB文件需要大约3秒来执行替换。

这种方法适用于vim。使用正则表达式,您可以找到4行,并用前两行代替它们。也适用于长文件。如果剩余的总行数除以4,则不适用于最后1-3行。

:%s#\(^.*\n^.*\)\n^.*\n^.*\n#\1\r#g

说明:

:%s - 替换整个文件,#用作分隔符

\(^.*\n^.*\) - \(\)选择两行,稍后将用作\1; \n代表换行; ^为行的开头; .*代码在换行前尽可能多地重复

\n - 第二行之后的换行符

^.*\n^.*\n - 接下来要删除的两行

\1\r - 替换前两行的行并添加换行\r

g - 适用于整个文件

Remove each 3rd and 4th lines