vim计数不包含模式的行数

vim计数不包含模式的行数,vim,Vim,给定下面的CSV文件,如何使用vim计算不包含以下内容的行数:fff或sss aaa bbb ccc ddd eee, 3221 aaa ddd eee fff, 3222 fff ddd sss www aaa, 3223 ggg www qqq, 3224 sss aaa vvv, 3225 我有这个,但它只匹配部分而不是全部 %s/\v^(fff|sss)//gn 您可以使用%从vim调用命令行的权限。因此,请键入以下内容并按enter键。它将带你到vim之外给你答案。再次按enter

给定下面的CSV文件,如何使用vim计算不包含以下内容的行数:
fff
sss

aaa bbb ccc ddd eee, 3221
aaa ddd eee fff, 3222
fff ddd sss www aaa, 3223
ggg www qqq, 3224
sss aaa vvv, 3225
我有这个,但它只匹配部分而不是全部

%s/\v^(fff|sss)//gn

您可以使用%从vim调用命令行的权限。因此,请键入以下内容并按enter键。它将带你到vim之外给你答案。再次按enter键,您将与之前一样返回vim

:%!grep -c -v -P "fff|sss"

^
锚定在行的开头,因此它匹配以fff或sss开头的行。只有在方括号内(
[^a]
匹配除
a
之外的任何内容时,它才是一种负数

您正在寻找类似以下内容:

%s/\v^((fff|sss)@!.)*$//gn
更多信息请访问
:help@

另一种避免复杂正则表达式的解决方案是使用global命令在所有与模式不匹配的行上增加一个变量:

let var=0
v/\v(sss|fff)/let var+=1
echo var
编辑:


可以使用以下全局命令删除所有行:

g/\v(sss|fff)/d

谢谢,如果我想删除包含fff或sss的所有行,您是否也可以帮助我执行此操作:
v/\v^((fff | sss)@!);$/d
does
g/\v(sss | fff)/d
执行相同操作以删除包含上述内容的所有行?
:g
:v
是相同的。参见
:help:v
是,因此我想知道
g/\v(sss | fff)/d
的@mMontu答案是否等同于
g/\v(sss | fff)/d
:g
:g是补充。第一个将删除包含“sss”或“fff”的所有行。第二个将删除所有不包含这些字符串的行。