我不确定这里到底发生了什么,但我试图使用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
因此删除了一些数据但由于某种原因,其他行中的数据未被删除。这发生在整个文件中,我看不到任何可描述的模式?我的表情有问题吗?
答案 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]\+$//