给定一个具有偶数行的文件,如何将第二半的行交错到前半部分?例如,从这个:
a
b
c
1
2
3
Run Code Online (Sandbox Code Playgroud)
对此:
a
1
b
2
c
3
Run Code Online (Sandbox Code Playgroud)
一种可能的解决方案是将这些一半写入分离的文件,然后使用该paste实用程序.
:1,3w a | 4,6w b
:%!paste -d \\n a b
Run Code Online (Sandbox Code Playgroud)
但是,我想在Vim中找到一个简单的方法 - 使用本机命令.
该:g命令经常用于迭代行并执行一些命令.在这种情况下,它可以用于迭代文件后半部分的行,同时将行从前半部分移动到适当的相对位置:m.
考虑到我们将光标放在第二行的第一行,此行必须在前半部分的第一行之前,因此我们可以将其移动到那里:1 m -1
(将第1行移动到位置-1,相对于光标).在此之后,第1行现在应该在第二行的第二行之前.因此,需要将光标向下移动并重复此过程,方便地执行
:g.简而言之,首先跳到下半场的第一线50%然后:
:,$g/^/1m-1
Run Code Online (Sandbox Code Playgroud)
作为一个命令,它将整个块的范围隔行扫描(两半)或默认为整个文件:
command! -range=% Interleave execute 'keeppatterns'
\ (<line2>-<line1>+1)/2+<line1> ',' <line2>
\ 'g/^/<line1> move -1'
Run Code Online (Sandbox Code Playgroud)
:Interleave
Run Code Online (Sandbox Code Playgroud)
注意: :Interleave 用于 :keeppatterns防止搜索寄存器和历史记录发生变化.:keeppatterns
需要Vim 7.4.083+