分页: 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一下:
注意:<>指特殊键,不要原样输入。其它的除换行外请原样输入。当然,开始的时候是在普通模式下。
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>