views:

160

answers:

5

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
+5  A: 
:%!uniq

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

John Weldon
Good suggestion, I should have mentioned in the question that I'm on Windows (and no Cygwin).
Dave Tapley
+5  A: 

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

g/^\(.*\)$\n\1$/d
Dave Tapley
+1  A: 

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

:%!uniq
Juliano
A: 

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
rampion
A: 

if I want keep blank lines?