Удаление смежных повторяющихся строк в vi без сортировки - PullRequest
13 голосов
/ 29 апреля 2010

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

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

Пример раньше:

Foo
Foo
Bar
Bar

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

Foo
Bar

Ответы [ 6 ]

25 голосов
/ 29 апреля 2010

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

g/^\(.*\)$\n\1$/d
16 голосов
/ 29 апреля 2010
:%!uniq

если вы работаете в системе Unix или в системе, в которой установлена ​​программа uniq

10 голосов
/ 30 апреля 2010

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

: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
3 голосов
/ 29 апреля 2010

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

:%!uniq
0 голосов
/ 03 октября 2016

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

:sort u
0 голосов
/ 30 апреля 2014
:%s/^\(.*\)\(\n\1\)\+$/\1/ge

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...