Удаление смежных повторяющихся строк в vi без сортировки

В этом вопросе уже рассматриваются способы удаления повторяющихся строк, но выполняется принудительное сортирование списка.

Я бы хотел выполнить этап удаления смежных повторяющихся строк (т.е. uniq) без их первой сортировки.

Пример до:

Foo
Foo
Bar
Bar

Пример после:

Foo
Bar

Ответ 1

Просто нашел решение здесь. Следующее регулярное выражение работает правильно:

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

Ответ 2

:%!uniq

если вы используете систему unix или систему с программой uniq

Ответ 3

Если вы хотите удалить несмежные дубликаты, вы можете использовать

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

(который удалит все, кроме последней копии строки)

который изменил бы

Foo
Bar
Foo
Bar
Foo
Baz
Foo
Quux

to

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

Ответ 4

Если вы просто хотите удалить повторяющиеся строки смежных, просто используйте uniq, не сортируя ничего.

:%!uniq

Ответ 5

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

это мой ответ для вас

Ответ 6

Я знаю, что это старо, но стоит упомянуть, что следующее также работает, если вы не против сортировки (я знаю, что OP хотел его избежать):

:sort u