分页: 1 / 1

在VIM中如何删除这样两行中的一行

发表于 : 2009-07-07 10:19
flyingtxh
我有一个文本,格式是这样的
A B
C D
E F
B A
F E
D C
....
....

对于类似于A B和B A这样的两行,我只想保留其中的一行,请问通过VIM如何能够实现?谢谢!

Re: 在VIM中如何删除这样两行中的一行

发表于 : 2009-07-07 19:29
lilydjwg
看来每行的两项是无序的,那么可以这样(假设这两项以空格分开):
先排序:

代码: 全选

:%s/ /\r/<CR>
ggqqqqqVj:sor<CR>Jj@qq@q<ESC>
再uniq一下:

代码: 全选

:%!sort|uniq<CR>
注意:<>指特殊键,不要原样输入。其它的除换行外请原样输入。当然,开始的时候是在普通模式下。

Re: 在VIM中如何删除这样两行中的一行

发表于 : 2009-07-07 23:14
flyingtxh
刚才试过是可行的,谢谢lilydjwg提供的方法。貌似是递归调用@q,我的理解对吧?

Re: 在VIM中如何删除这样两行中的一行

发表于 : 2009-07-07 23:49
lilydjwg
flyingtxh 写了:刚才试过是可行的,谢谢lilydjwg提供的方法。貌似是递归调用@q,我的理解对吧?
对。从Vim的Wiki上学的,很有用的办法。

Re: 在VIM中如何删除这样两行中的一行

发表于 : 2009-07-08 1:29
xhy

代码: 全选

ggqxVj:sor<CR>Jj@xq@x<ESC>
写递归宏的那句,这样就可以了

Re: 在VIM中如何删除这样两行中的一行

发表于 : 2009-07-08 8:57
flyingtxh
xhy 写了:

代码: 全选

ggqxVj:sor<CR>Jj@xq@x<ESC>
写递归宏的那句,这样就可以了
谢谢xhy,不过我对比了一下你的和 lilydjwg 的方法差别,你的方法在记录宏x的过程中就会运行宏x,而 lilydjwg 的不会,后来发现是刚开始没有清除寄存器的缘故,如果用寄存器x:

代码: 全选

ggqxqqxVj:sor<CR>Jj@xq@x<ESC>