Python 查找每三个值并在VIM中插入cr或换行符
所以我有几个大数据集,我需要使其更具可读性,目前我必须进入并移动到每个第三个值,并插入一个换行符。我在VIM中尝试了几种方法来实现这一点,但似乎没有一种方法能够返回我想要的值。以下是我的一些数据:Python 查找每三个值并在VIM中插入cr或换行符,python,vim,Python,Vim,所以我有几个大数据集,我需要使其更具可读性,目前我必须进入并移动到每个第三个值,并插入一个换行符。我在VIM中尝试了几种方法来实现这一点,但似乎没有一种方法能够返回我想要的值。以下是我的一些数据: (0.96260310749184663, 4.3830008206495812, 0.84922658632317849), (0.96260310749184663, 5.0000002088986637, 1.049701855818201), (0.96260310749184697, 5.6
(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.ex命令和格式
我的第一个想法是textwidth
:
:se tw=50
:g/./norm! gqq
:%s/^[^(]/ &/g
这个
开头的任何行的开头插入空格(
gg
qq2f,a<CR><Esc>j0q
100000@q
gg
qq2f,aj0q
100000@q
理由:
q
(qq
开始录制,q
结束录制)
-转发到第二个逗号2f,
-追加换行符a
-下一行,将插入符号移动到第一个字符j0
我会这样做:
(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),
'<,'>s/^[^,]\+,[^,]\+,\zs/\r
”使用宏格式化一行并转到下一行的开头。然后根据需要多次应用该宏
因此,开始录制宏是q
,其中
是一个寄存器,然后编辑行,再次按q
保存宏。最后,使用@
应用宏,您可以在前面加上多次重复的前缀。制作一个递归宏(作为@sehe的10万倍宏答案的替代方案)
ggqa2f,aj@aq
然后@a
在第二行运行命令(您不需要移动光标)
可视化:
gg
qa
2f,
a
j@aq
@a
:g/./norm! 2Wi^M
说明:
:g//{cmd}
将在每一行上运行{cmd}
norm!
将执行以下字符串作为正常模式命令
2Wi^M
Move 2WORDS
然后插入返回
^M
通过按
或
完成
执行%norm!2Wi^M
非常有诱惑力,但这将失败,因为它会弄乱正在处理的行。由于要打断的整个文本最初在一行中,因此可以使用单个
短替换命令
:s/,.\{-},\|), /&\r/g
我认为第二种形式并不比第一种形式更具可读性。但是,我同意,我们正试图保持小于80个字符的宽度,因为我们中的许多人在一次会话中一次打开多个文件。与其说是“看起来更好”,不如说是一种内在的东西事情。我用你的宏解决方案在MacVim中得到了一个E16:Invalid range
错误。我用了一种替代的递归宏方法来避免这个错误。@Jin:这很奇怪。MacVim应该可以移植。也许有一个选项我不知道。我一直都在这样做。你确实输入了10000@q
(无论数字是多少)在正常模式下,是吗?哦,哦,我是在命令模式下输入的。你的解决方案有效!我的不好。今天我自己也学习了递归宏。对你来说+1。这几乎很好。我必须进入并手动向下移动一些宏,但效果很好。我最终使用:qq2Wi,因为我的数据都在一行上,然后运行了1000次。我喜欢你的第一种方法!但是,它的第二个命令肯定有错误。我认为,它应该是:g//norm!gqq
。有趣的是,你提出了完全相同的宏。我不知道你可以做递归宏。不过,我不确定是否要递归使用它。在非递归中,似乎更容易正确、测试和控制formHey-我看到你编辑了你的答案。使用递归宏和同时使用基于范围的ex命令的基本原理是什么?我认为在第一行启动宏就足够了?@sehe是的,我刚刚意识到。编辑!事实上,使用:%
命令影响缓冲区lin有问题ecoount.Witness::让@a=“2f,a”
,:%norm@a
只转换部分document@sehe是的,这就是我第一次使用宏时遇到的问题。嗯,一个否决票..将我的文本替换为以下内容:(-8.11645653696472E-05,^M0.33500269811692118,-0.0046069731261416669),^M
不是文字^M
你需要按
然后按
或回车键。:hi\u Ctrl-V
明白了。谢谢。仍然习惯于VIM。它工作很好,但只在一行上,因此选择了另一个答案作为接受答案,但这肯定会对我的工作流程有所帮助。只需添加一个sub替换并删除最后一行。:s/)、\s*/)、\r/g |$d | g//norm!2Wi^M
太棒了。这正是我要找的。先生,谢谢。@sehe::substitute
命令在一行上运行,这一点没有错。它的目的是这样做的,因为要转换的整个文本都在一行中。
'<,'>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
:g/./norm! 2Wi^M
:s/,.\{-},\|), /&\r/g