这篇文章可能算作重复,但我在之前的主题中没有找到任何相关的答案。我有一个大的(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
接近我想要的但它也删除了第二行。
答案 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
- 适用于整个文件