Vim 如何删除包含少于n个项目的所有行

Vim 如何删除包含少于n个项目的所有行,vim,sed,awk,vi,Vim,Sed,Awk,Vi,我想删除包含少于n个项目的所有行,以空格分隔 假设我要删除包含少于3项的行。因此,文件如下: sdf sdfsdf sdfgsdf sdfsdfsd sdf sdfsdf sdf sdfsdf sdfgsdf sdf sdfsdf sdfgsdf ertert 应导致: sdf sdfsdf sdfgsdf sdfsdfsd sdf sdfsdf sdfgsdf sdf sdfsdf sdfgsdf ertert 实际上,awk和sed解决方案都是可以接受的。这个怎么样: awk

我想删除包含少于n个项目的所有行,以空格分隔

假设我要删除包含少于3项的行。因此,文件如下:

sdf sdfsdf sdfgsdf sdfsdfsd
sdf sdfsdf 
sdf sdfsdf sdfgsdf 
sdf sdfsdf sdfgsdf  ertert
应导致:

sdf sdfsdf sdfgsdf sdfsdfsd
sdf sdfsdf sdfgsdf 
sdf sdfsdf sdfgsdf  ertert
实际上,
awk
sed
解决方案都是可以接受的。

这个怎么样:

awk 'NF >= 3' filename

我知道您要求一个vi解决方案,但这在perl中非常简单:

ethan@rover:~$ perl -ne 'print if split > 3' foo

其中“foo”是您的文件。

NF是记录中的字段数。将2替换为所需的数字

awk '{if (NF > 2) print $0}' inputFile.txt
希望这对vim有帮助:

:v/\(\S\+\s\+\)\{3,}/d
另一个选择是

:g/./exec len(split(getline('.'))) < 3 ? 'd' : ''

因为有一个vim标签:

:v/\(\S\+\s\)\{2,}\S/d

用n-1替换2。

适用于MJB。在这种情况下,awk比Perl更合适。如果您将数字作为shell值:
awk-vn=$num'NF>=n'文件
我考虑过添加它,但我认为越简单越好。谢谢你让我的答案更完整。
:py vim.current.buffer[:] = [l for l in vim.current.buffer if len(l.split()) >= 3]
:v/\(\S\+\s\)\{2,}\S/d