Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找每三个值并在VIM中插入cr或换行符_Python_Vim - Fatal编程技术网

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

Python 查找每三个值并在VIM中插入cr或换行符,python,vim,Python,Vim,所以我有几个大数据集,我需要使其更具可读性,目前我必须进入并移动到每个第三个值,并插入一个换行符。我在VIM中尝试了几种方法来实现这一点,但似乎没有一种方法能够返回我想要的值。以下是我的一些数据: (0.96260310749184663, 4.3830008206495812, 0.84922658632317849), (0.96260310749184663, 5.0000002088986637, 1.049701855818201), (0.96260310749184697, 5.6

所以我有几个大数据集,我需要使其更具可读性,目前我必须进入并移动到每个第三个值,并插入一个换行符。我在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.ex命令和格式 我的第一个想法是
textwidth

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

  • 将文本宽度设置为50个字符
  • 重新格式化每一行(非空)
  • 在不以
    开头的任何行的开头插入空格(
  • 2.使用宏 或者:制作一个宏

    gg
    qq2f,a<CR><Esc>j0q
    100000@q
    
    gg
    qq2f,aj0q
    100000@q
    
    理由:

  • 转到缓冲区的开头
  • 录制宏
    q
    qq
    开始录制,
    q
    结束录制)
    • 2f,
      -转发到第二个逗号
    • a
      -追加换行符
    • j0
      -下一行,将插入符号移动到第一个字符
  • 漂洗和重复(100000是重复的次数;当宏失败时,处理将停止(例如,在文件末尾)

  • 我会这样做:

    (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 2
      WORDS
      然后插入返回
    • ^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