This question已经解决了如何删除重复行,但强制首先对列表进行排序。
我想执行删除连续重复行步骤(即uniq
)而不先对它们进行排序。
之前的例子:
Foo
Foo
Bar
Bar
之后的例子:
Foo
Bar
答案 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