VIM:交换由空格分隔的两列

时间:2014-06-25 22:58:52

标签: vim

我有两列:

cats dog  
dog cats

我想换掉两列:

dog cats
cats dog 

使用vim我该怎么做?

6 个答案:

答案 0 :(得分:20)

我的第一个想法,一个替代,最终看起来太像Birei了,所以我选择AWK(我不太了解)用作过滤器:

:%!awk '{print $2, $1}'

答案 1 :(得分:8)

您可以使用正则表达式使用\S表示非空白字符,\s表示空白字符,例如:

:%s/\v^(\S+)\s+(\S+).*$/\2 \1/

它产生:

dog cats
cats dog

答案 2 :(得分:1)

如果列采用整个文件,请使用:

:%normal "adt xA <CTRL-v><CTRL-r>a

如果它只是文件的一部分,请进行视觉选择,最后使用:

:'<,'>normal "adt xA <CTRL-v><CTRL-r>a

说明:

  • %'<,'>:对整个文件(%)或特定部分('<,'>)运行以下命令;
  • "adt:删除所有内容,直到第一个空格(未包含空格)并将删除的文本存储在注册表a中。
  • x:删除尾随空格;
  • A:开始附加文字;
  • <CTRL-v><CTRL-R>a:输入<CTRL-r>命令(它将显示^R),其中插入了注册表a的内容。

答案 3 :(得分:1)

您可以通过这种简单的方式实现这一目标,即第一列和第二列中的任何字符

 :%s/\(.\+\)\(\s\+\)\(.\+\)/\3\2\1/g

答案 4 :(得分:1)

可以使用以下宏:

qaqqadf A <esc>pj0q99@a
  1. qaq清除注册表a。
  2. qa开始在注册a中录制宏。
  3. df删除直到空格
  4. A在行尾添加并留出空格
  5. <esc>p进入正常模式并粘贴。
  6. j0转到下一行的第一列。
  7. q停止宏a
  8. 99 @ a运行此宏99次(假设您剩下99列)

答案 5 :(得分:1)

«交换两列»插件

是的,有一个swap two columns Vim插件这样的东西。

        111  222  333  444  555        333  222  111  444  555
        111  222  333  444  555        333  222  111  444  555
        111  222  333  444  555    →   333  222  111  444  555
        111  222  333  444  555        333  222  111  444  555
        111  222  333  444  555        333  222  111  444  555