Removing contiguous duplicate lines in vi without

2020-05-19 07:56发布

问题:

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

回答1:

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

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


回答2:

:%!uniq

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



回答3:

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


回答4:

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

:%!uniq


回答5:

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

this is my answer for you



回答6:

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