【问题标题】:vim count number of lines not containing a patternvim count 不包含模式的行数
【发布时间】:2015-08-04 18:36:59
【问题描述】:

给定下面的 CSV 文件,我如何使用 vim 计算不包含的行数:fffsss

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


    【解决方案1】:

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

    你正在寻找这样的东西:

    %s/\v^((fff|sss)@!.)*$//gn
    

    更多信息请访问:help @!

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

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

    编辑:


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

    g/\v(sss|fff)/d
    

    【讨论】:

    • 谢谢,如果我想删除所有包含 fff 或 sss 的行,你能帮忙吗:v/\v^((fff|sss)@!.)*$/d
    • g!/\v(sss|fff)/d 是否同样删除包含上述内容的所有行?
    • :g!:v 是相同的。见:help :v
    • 是的,所以我很想知道g/\v(sss|fff)/d 的@mMontu 答案是否等同于g!/\v(sss|fff)/d
    • :g:g! 是互补的。第一个将删除所有包含“sss”或“fff”的行。第二个将删除所有 not 包含这些字符串的行。
    【解决方案2】:

    您可以使用 % 从 vim 调用命令行的功能。所以输入以下内容并按回车键。它会带你到 vim 之外给你答案。再次按回车键,你就回到了 vim 中。

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

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多