【问题标题】:Remove first N fields separated by delimiter删除由分隔符分隔的前 N ​​个字段
【发布时间】:2013-07-14 13:36:59
【问题描述】:
f1,f2,f3,f4,f5,,,,
f1,f2,f3,f4,f5,,,,
f1,f2,f3,f4,f5,,,,
f1,f2,f3,f4,f5,,,,

假设 fN 是一些字符序列,除了,

如何删除前 3 个字段?

到目前为止,我已经尝试过%s/^.*,.*,.*,//,但它删除了整行。

【问题讨论】:

    标签: regex vim vi


    【解决方案1】:

    假设您的光标位于第一行第一列。字段也具有相同的宽度(如您的示例所示)

    您可以按以下按键顺序(6 次击键):

    <Ctrl-V>G3f,x
    

    如果字段的长度不同,您可以:

    q录制宏:

    qq0v3f,xjq
    

    然后,重播宏,例如,99 次:

    99@q
    

    或在命令行中执行:

    %s/\v^([^,]*,){3}//
    

    【讨论】:

    • 您能解释一下\v 的含义吗?
    【解决方案2】:

    您可以使用cut,使用分隔符选项d,(设置,作为分隔符),然后选择您想要的-f4-(从4到结尾的所有字段...)

    【讨论】:

      【解决方案3】:

      问题在于* 修饰符是贪婪的,即它匹配所有可以得到的字符

      将值限制为任何字符逗号分隔符除外[^,]:

      :%s/^\([^,]*,\)\{3}//
      

      或使用非贪婪变体.\{-}

      :%s/^\(.\{-},\)\{3}//
      

      另类

      对于逗号分隔值 (CSV) 文件处理,您可能还对 csv.vim plugin 感兴趣,它提供了 :DeleteColumn 命令。

      【讨论】:

        猜你喜欢
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多