删除由分隔符分隔的前N个字段

时间:2013-07-16 11:33:14

标签: regex vim vi

f1,f2,f3,f4,f5,,,,
f1,f2,f3,f4,f5,,,,
f1,f2,f3,f4,f5,,,,
f1,f2,f3,f4,f5,,,,

假设fN是除,之外的某些字符序列。

如何删除前3个字段?

到目前为止,我已尝试%s/^.*,.*,.*,//,但它会移除整行。

3 个答案:

答案 0 :(得分:4)

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

你可以按下面的按键顺序(6次击键):

<Ctrl-V>G3f,x

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

使用q记录宏:

qq0v3f,xjq

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

99@q

或在命令行中执行:

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

问题是*修饰符 greedy ,即它匹配它可以获得的所有字符

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

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

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

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

替代

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