我有两列:
cats dog
dog cats
我想换掉两列:
dog cats
cats dog
使用vim我该怎么做?
答案 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
qaq
清除注册表a。qa
开始在注册a中录制宏。df
删除直到空格A
在行尾添加并留出空格<esc>p
进入正常模式并粘贴。j0
转到下一行的第一列。q
停止宏a 答案 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