在VIM中查找每第三个值并插入换行符或回车符
我有几个很大的数据集,需要让它们更容易阅读。目前我得一个一个地去找每第三个值,然后插入换行符。我在VIM里尝试了几种方法,但都没有达到我想要的效果。这是我的一些数据:
(0.96260310749184663, 4.3830008206495812, 0.84922658632317849),
(0.96260310749184663, 5.0000002088986637, 1.049701855818201),
(0.96260310749184697, 5.6169993576359696, 0.8492264385213405),
(0.96260310749184719, 5.9983257940402384, 0.32437568665165911),
(0.96260310749184719, 5.9983258053918069, -0.32437572732698844),
(0.96260310749184719, 5.6169994358349786, -0.84922691097323821),
(0.96260310749184697, 5.0000000093711492, -1.0497019267383632)
我需要把它变成这样:
(0.96260310749184663, 4.3830008206495812,
0.84922658632317849),
(0.96260310749184663, 5.0000002088986637,
1.049701855818201),
(0.96260310749184697, 5.6169993576359696,
0.8492264385213405),
(0.96260310749184719, 5.9983257940402384,
0.32437568665165911),
(0.96260310749184719, 5.9983258053918069,
-0.32437572732698844),
(0.96260310749184719, 5.6169994358349786,
-0.84922691097323821),
(0.96260310749184697, 5.0000000093711492,
-1.0497019267383632)
我在选中部分使用了这个方法,想把第三个值移动到下一行,但结果是整个内容都被复制了一遍,然后整行也被移动了:
:'<,'>s/\([-[0-9.]\+,\s[-[0-9.]\+,\)/\1\r&/g
我还试着去掉那个1,想让它正常工作,但也没成功。那么有没有办法让我抓住那个第三个值,并插入一个换行符,让它正常工作呢?谢谢。
编辑---
我为没有清楚地表达我的问题而道歉:顶部的数据都是在一行上,而不是分成几行。它看起来是这样的:
(0.31852533878680489, 0.10352149350126813, -0.0046069731261429991), (0.31852526554320226, -0.103521543762028, -0.0046069731261429991), (0.19682845687859715, -0.27102285045297636, -0.004606973126142444), (-8.1184530326649769e-05, -0.33500267513407755, -0.0046069731261416669), (-0.19699089317458821, -0.27102292369657782, -0.0046069731261408897), (-0.31868770183919259, -0.10352150714022559, -0.0046069731261403346), (-0.31868770183919221, 0.10352156674487166, -0.0046069731261403346),
6 个回答
2
因为要处理的整个文本最开始都是在一行里的,所以可以用一个简单的替换命令来完成。
:s/,.\{-},\|), /&\r/g
5
两种方法
1. 使用 ex 命令和格式化
我首先想到的是 textwidth
:
:se tw=50
:g/./norm! gqq
:%s/^[^(]/ &/g
这个命令会:
- 把文本宽度设置为50个字符
- 重新格式化每一行(只要这一行不是空的)
- 在任何不以
(
开头的行前面插入一个空格
2. 使用宏
另外一种方法是:制作一个宏
gg
qq2f,a<CR><Esc>j0q
100000@q
原因:
- 移动到文本的开头
- 录制宏
q
(qq
开始录制,q
结束录制) 2f,
- 向前移动到第二个逗号a<CR><Esc>
- 添加一个换行j0
- 下一行,光标移动到第一个字符- 重复这个过程(100000是重复的次数;当宏失败时(比如到达文件末尾),处理会停止)
5
:g/./norm! 2Wi^M
解释:
:g/./{cmd}
这个命令会在每一行上执行{cmd}
这个操作。norm!
会把后面的内容当作普通模式的命令来执行。2Wi^M
的意思是移动两个单词
然后插入一个换行。^M
可以通过按<c-v><cr>
或<c-q><cr>
来实现。
虽然很想用 %norm! 2Wi^M
来一次性处理,但这样会出问题,因为它会搞乱正在处理的行。