将行转换为VIM中的列

时间:2012-07-18 18:51:33

标签: perl vim

我有一个如下数据文件:

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

但我希望它采用以下格式

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

在VIM或Perl中进行转换的最快方法是什么? 感谢。

3 个答案:

答案 0 :(得分:5)

基本上:.s/ / 空格 Ctrl + v 输入 /g 输入 {{ 1}} Ctrl + v 输入 jma:.s/ / 输入 Ctrl + v /g将做的伎俩。 :)

好的,让我们打破它:

  1. 'axgg$p'adG Ctrl + v 输入 :.s/ / 输入:在当前行(/g ),用空格替换(.)空格(s)后跟回车符(空格 Ctrl + v Enter < / kbd> / /),在所有位置(/)。光标现在应该在最后一个字母的行上(示例中为g)。
  2. e:向下一行(到j)。
  3. A B C D E:将标记ma设置为当前位置...因为我们希望稍后引用此位置。
  4. a Ctrl + v 输入 :.s/ / 输入:执行与上面相同的替换,但没有空间。光标现在应该在最后一个字母的行上(示例中为/g)。
  5. Ctrl + v E:从当前光标位置('a)中选择以标记E(我们在上面的步骤3中设置),使用块选择。
  6. a:剪切选区(进入x注册表)。
  7. ":将光标移动到第一行。
  8. gg:将光标移动到行尾。
  9. $:将先前剪切的文本粘贴到光标位置之后。
  10. p:将光标移动到'a标记(在步骤3中设置)。
  11. a:删除从光标位置到文件末尾的所有内容(底部留下的空行)。
  12. P.S。我希望了解一个“内置”解决方案,但直到这个时候......

答案 1 :(得分: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

答案 2 :(得分:3)

假设光标位于两行中的第一行,我会使用 命令

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