在vi中删除连续的重复行而不进行排序

时间:2010-04-29 16:02:22

标签: regex vim vi duplicate-data

This question已经解决了如何删除重复行,但强制首先对列表进行排序。

我想执行删除连续重复行步骤(即uniq)而不先对它们进行排序。

之前的例子:

Foo
Foo
Bar
Bar

之后的例子:

Foo
Bar

6 个答案:

答案 0 :(得分:25)

刚刚找到解决方案here。以下正则表达式正常工作:

g/^\(.*\)$\n\1$/d

答案 1 :(得分:16)

:%!uniq

如果您使用的是unix系统或具有uniq程序

的系统

答案 2 :(得分:10)

如果要删除不连续的重复项,可以使用

:g/^\(.*\)\ze\n\%(.*\n\)*\1$/d

(将删除除行的最后一个副本之外的所有副本)

会改变

Foo
Bar
Foo
Bar
Foo
Baz
Foo
Quux

Bar
Baz
Foo
Quux

如果要删除除第一份副本以外的所有副本,请尝试

:g/^/m0
:g/^\(.*\)\ze\n\%(.*\n\)*\1$/d
:g/^/m0

会改变

Foo
Bar
Foo
Bar
Foo
Baz
Foo
Quux

Foo
Bar
Baz
Quux

答案 3 :(得分:3)

如果您只想删除连续重复的行,只需使用uniq而不进行任何排序。

:%!uniq

答案 4 :(得分:0)

:%s/^\(.*\)\(\n\1\)\+$/\1/ge

这是我的回答

答案 5 :(得分:0)

我知道这已经过时了,但是值得一提的是,如果您不介意排序,也可以使用以下内容(我知道OP希望避免它):

:sort u