所以我有几个大型数据集,我需要使其更具可读性,目前我必须进入并移动到每个第3个值并插入换行符。我已经在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)
我在选择中使用它来尝试让它将第3个值向下移动,但它重复整个事物然后将整行移动:
:'<,'>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),
答案 0 :(得分:5)
两种方法
我的第一个想法是textwidth
:
:se tw=50
:g/./norm! gqq
:%s/^[^(]/ &/g
这个
(
或者:制作一个宏
gg
qq2f,a<CR><Esc>j0q
100000@q
理由:
q
(qq
开始录制,q
结束录制)
2f,
- 转发至第二个逗号a<CR><Esc>
- 追加换行j0
- 下一行,将插入符号移到第一个字符答案 1 :(得分:5)
:g/./norm! 2Wi^M
说明:
:g/./{cmd}
将在每一行上运行{cmd}
norm!
将执行以下字符串作为普通模式命令2Wi^M
移动2 WORDS
然后插入返回^M
是通过按<c-v><cr>
或<c-q><cr>
。做%norm! 2Wi^M
非常诱人,但这会失败,因为它弄乱了正在处理的行。
答案 2 :(得分:2)
由于整个文本最初都在一行中,因此可以使用单个文本 短替换命令,
:s/,.\{-},\|), /&\r/g
答案 3 :(得分:1)
我这样做的方式是这样的:
'<,'>s/^[^,]\+,[^,]\+,\zs/\r
翻译:
'<,'> " Over the visual range
s/X/Y " Substitute X with Y
^ " Start of line
[^,]\+ " Anything that isn't a comma, one or more, as many as possible
, " A comma (end of first field)
[^,]\+ " Anything that isn't a comma, one or more again
, " A comma (send of second field)
\zs " Mark this point as the start of the match so we don't have to bother including all of the above in the result
\r " We're replacing nothing at the end of the above match with a new-line (\r)
另一种选择:
'<,'>s/^\(.\{-},\)\{2}/&\r
翻译:
'<,'>s/X/Y " As before
^ " Start of line
\(...\) " A group containing:
.\{-}, " Everything up to and including the first comma
\{2} " Match the preceding group twice (so up to and including the second comma)
&\r " Replace with what was already there followed by a new-line
另一个......假设您有相同的数据宽度,请导航到第一行第三列之前的空格。点击Ctrl-V
然后向下移动,以便选择整个空格列(示例中为6j
)。按s
或Shift-i
(取决于您是否要保留空格),然后按 ENTER 然后 ESC 。
答案 4 :(得分:1)
使用宏格式化一行并转到下一行的开头。然后根据需要应用该宏。
因此,开始录制宏是q_
,其中_
是注册,然后编辑您的行,再次按q
以保存宏。最后,使用@_
应用它,您可以多次重复前缀。
答案 5 :(得分:1)
制作一个递归宏(作为@ sehe的宏 - 换句100000次的替代)。
ggqa2f,a<CR><Esc>j@aq
然后@a
在第二行运行命令(您不需要移动光标)。
可视化:
gg
qa
2f,
a<Cr><Esc>
j@aq
@a