奇怪的vim正则表达式行为

时间:2014-05-28 00:05:01

标签: regex vim replace

我不确定这里到底发生了什么,但我试图使用vim从文件中删除一些数据。数据是6个逗号分隔的值。我想从每一行中删除最后三行。我使用正则表达式查找替换%s/,[0-9]*,[0-9]*,[0-9]*$//g。我在以下数据上使用它:

7.95630550,-3.53701925,-1.04588318,52,40,40
2.60749245,-3.85793233,0.43392944,77,41,19
10.12495995,1.63384104,1.23306274,40,31,42
10.14402199,-3.11163330,1.23091125,40,29,36
-0.49531555,-3.59129953,-1.24293518,62,53,52

我明白了:

7.95630550,-3.53701925,-1.04588318
2.60749245,-3.85793233,0.43392944
10.12495995,1.63384104,1.23306274,40,31,42
10.14402199,-3.11163330,1.23091125,40,29,36
-0.49531555,-3.59129953,-1.24293518

因此删除了一些数据但由于某种原因,其他行中的数据未被删除。这发生在整个文件中,我看不到任何可描述的模式?我的表情有问题吗?

5 个答案:

答案 0 :(得分:2)

对于它的价值,你的命令在给定的样本上按预期工作,这里问题可能超出你的正则表达式。

但为什么要这么复杂?

:%norm $3F,D

答案 1 :(得分:1)

如果字段数从行的开头搜索时,此regex应该有效。

:g/\(.\{-}\zs,\)\{3}/normal nd$

在每一行上出现,的3次出现并删除到行尾。

答案 2 :(得分:1)

处理分隔文件时,您可以使用分隔符的补充,通过在字符类中指定它 - 例如如果分隔符为,,则赞美为[^,]

%s/\(,[^,]\+\)\{3\}$//

这将替换3个“逗号,后跟一个或多个非逗号字符”,后跟行尾。什么都没有。

答案 3 :(得分:1)

或者使用cut:

:%!cut -d, -f 1-3
  • 剪切从文件中提取文字以获取更多帮助,请参阅man cut
  • -d,将逗号设置为分隔符
  • -f 1-3你想" cut"或提取字段1-3
  • :%!{cmd}通过shell命令{cmd}过滤整个文件。请参阅:h :range!

答案 4 :(得分:0)

你在最后一个上丢了一个星号而你最后不需要/ g:

:%s/,[0-9]*,[0-9]*,[0-9]*$//

话虽如此,为了让它更安全,你可能想要使用+而不是*,在这种情况下你需要逃避它:

:%s/,[0-9]\+,[0-9]\+,[0-9]\+$//