2012-07-18 71 views
3

我有類似如下的數據文件:變換行轉換成列在VIM

---------------------------- 
a b c d e ............. 
A B C D E ............. 
---------------------------- 

但我希望它是按以下格式

---------------------------- 
a A 
b B 
c C 
d D 
e E 
... 
... 
---------------------------- 

怎樣做改造的最快方法在VIM或Perl? 謝謝。列

+2

[轉置插件](https://github.com/salsifis/vim-transpose)可以做到這一點。 – pb2q 2012-07-18 19:43:44

回答

5

基本上:.s/ /空間CTRL + V輸入/g輸入jma:.s/ /CTRL + V輸入/g輸入CTRL + V'axgg$p'adG會做的伎倆。 :)

OK,讓我們打破下來:

  1. :.s/ /CTRL + V輸入/g輸入:在當前行(.),替代(s)空間(/ /)與一個空格,然後回車(空間Ctrl + v輸入/),在所有位置(g)。光標現在應該在最後一個字母的行上(示例中的e)。
  2. j:往下一行(至A B C D E)。
  3. ma:將標記a設置爲當前位置...因爲我們稍後要參考此位置。
  4. :.s/ /CTRL + V輸入/g輸入:不要與上述相同的替代,但沒有空間。光標現在應該在最後一個字母的行上(示例中的E)。
  5. CTRL + V'a:從當前光標位置(E)選擇標記a(我們在上面步驟3中設定),使用該塊選擇。
  6. x:剪切選擇(進入"寄存器)。
  7. gg:將光標移動到第一行。
  8. $:將光標移動到行的末尾。
  9. p:將先前剪切的文本粘貼到光標位置後面。
  10. 'a:將光標移動到a標記(在步驟3中設置)。
  11. dG:從光標位置到文件末尾刪除所有內容(底部留下的空行)。

附:我希望瞭解一個「內置」的解決方案,但是,直到......

4

簡單的重新映射:

use strict; 
use warnings; 

my @a = map [ split ], <>; # split each line on whitespace and store in array 
for (0 .. $#{$a[0]}) {  # for each such array element 
    printf "%s %s\n", $a[0]->[$_], $a[1]->[$_]; # print elements in order 
} 

用法:

perl script.pl input.txt 
+0

直接轉換VIM中的數據文件會很好。這可以重寫爲在VIM中使用嗎? – stonebird 2012-07-18 19:27:28

+1

@stonebird不是由我。但是,如果你可以在Perl中乾淨地做到這一點,你爲什麼要這麼做呢? – TLP 2012-07-18 19:29:05

+2

你可以在Vim中使用Perl腳本。看看':help:perl' – 2012-07-18 19:31:53

3

假設光標在第一個兩行的,我會用 命令

:s/ /\r/g|+&&|'[-;1,g/^/''+m.|-j 
+0

它的工作原理!對此有何解釋或分解? – stonebird 2012-07-24 14:44:47