15

这个问题已经解决了如何删除重复行,但强制列表首先排序。

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

之前的例子:

Foo
Foo
Bar
Bar

之后的示例:

Foo
Bar
4

6 回答 6

28

刚刚在这里找到了解决方案。以下正则表达式可以正常工作:

g/^\(.*\)$\n\1$/d
于 2010-04-29T16:04:38.500 回答
20
:%!uniq

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

于 2010-04-29T16:04:34.953 回答
14

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

: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
于 2010-04-30T16:49:48.387 回答
3

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

:%!uniq
于 2010-04-29T16:04:52.020 回答
0
:%s/^\(.*\)\(\n\1\)\+$/\1/ge

这是我给你的答案

于 2014-04-30T06:49:02.857 回答
-1

我知道这很旧,但值得一提的是,如果您也不介意排序(我知道 OP 想要避免它),以下内容也适用:

:sort u
于 2016-10-03T06:34:25.730 回答