开发者

Removing contiguous duplicate lines in vi without sorting

This question already addresses how to remove duplicate lines, but enforces that the list is sorted first.

I would like to perform the remove contiguous duplicate lines step (开发者_开发知识库i.e. uniq) without first sorting them.

Example before:

Foo
Foo
Bar
Bar

Example after:

Foo
Bar


Just found the solution here. The following regex works correctly:

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


:%!uniq

if you're on a unix system, or a system that has the uniq program


If you want to remove non-contiguous duplicates you could use

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

(which will remove all but the last copy of a line)

which would change

Foo
Bar
Foo
Bar
Foo
Baz
Foo
Quux

to

Bar
Baz
Foo
Quux

If you want to remove all but the first copy, try

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

which would change

Foo
Bar
Foo
Bar
Foo
Baz
Foo
Quux

to

Foo
Bar
Baz
Quux


If you just want to remove contiguous duplicate lines, just use uniq without sorting anything.

:%!uniq


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

this is my answer for you


I know this is old, but it's worth mentioning the following also works if you don't mind sorting as well (I know the OP wanted to avoid it):

:sort u
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜