找到每个第三个值并在VIM中插入cr或换行符

时间:2011-10-10 14:30:10

标签: python vim

所以我有几个大型数据集,我需要使其更具可读性,目前我必须进入并移动到每个第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), 

6 个答案:

答案 0 :(得分:5)

两种方法

1。 ex命令和格式

我的第一个想法是textwidth

:se tw=50
:g/./norm! gqq
:%s/^[^(]/ &/g

这个

  1. 将文字宽度设置为50个字符
  2. 重新格式化每条(非空)行
  3. 在任何不以(
  4. 开头的行的开头插入空格

    2。使用宏

    或者:制作一个宏

    gg
    qq2f,a<CR><Esc>j0q
    100000@q
    

    理由:

    1. 转到缓冲区的开头
    2. 记录宏qqq开始录制,q结束录制)
      • 2f, - 转发至第二个逗号
      • a<CR><Esc> - 追加换行
      • j0 - 下一行,将插入符号移到第一个字符
    3. 冲洗并重复(100000是重复的次数;处理将在宏发生故障时停止(例如在文件结束时)

答案 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)。按sShift-i(取决于您是否要保留空格),然后按 ENTER 然后 ESC

答案 4 :(得分:1)

使用宏格式化一行并转到下一行的开头。然后根据需要应用该宏。

因此,开始录制宏是q_,其中_是注册,然后编辑您的行,再次按q以保存宏。最后,使用@_应用它,您可以多次重复前缀。

答案 5 :(得分:1)

制作一个递归宏(作为@ sehe的宏 - 换句100000次的替代)。

ggqa2f,a<CR><Esc>j@aq

然后@a在第二行运行命令(您不需要移动光标)。

可视化:

gg

enter image description here

qa

enter image description here

2f,

enter image description here

a<Cr><Esc>

enter image description here

j@aq

enter image description here

@a

enter image description here