在VIM中查找每第三个值并插入换行符或回车符

4 投票
6 回答
736 浏览
提问于 2025-04-17 04:01

我有几个很大的数据集,需要让它们更容易阅读。目前我得一个一个地去找每第三个值,然后插入换行符。我在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

这个命令会:

  1. 把文本宽度设置为50个字符
  2. 重新格式化每一行(只要这一行不是空的)
  3. 在任何不以 ( 开头的行前面插入一个空格

2. 使用宏

另外一种方法是:制作一个宏

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

原因:

  1. 移动到文本的开头
  2. 录制宏 qqq 开始录制,q 结束录制)
    • 2f, - 向前移动到第二个逗号
    • a<CR><Esc> - 添加一个换行
    • j0 - 下一行,光标移动到第一个字符
  3. 重复这个过程(100000是重复的次数;当宏失败时(比如到达文件末尾),处理会停止)
5
:g/./norm! 2Wi^M

解释:

  • :g/./{cmd} 这个命令会在每一行上执行 {cmd} 这个操作。
  • norm! 会把后面的内容当作普通模式的命令来执行。
  • 2Wi^M 的意思是移动两个 单词 然后插入一个换行。
  • ^M 可以通过按 <c-v><cr><c-q><cr> 来实现。

虽然很想用 %norm! 2Wi^M 来一次性处理,但这样会出问题,因为它会搞乱正在处理的行。

撰写回答