Я думаю, что следующая команда должна работать:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Пояснение:
Мы используем команду замещения для всего файла, чтобы изменить pattern
на string
:
:%s/pattern/string/
Вот pattern
это ^\(.*\)\(\n\1\)\+$
и string
есть \1
.
pattern
может быть разбито так:
^\(subpattern1\)\(subpattern2\)\+$
^
и $
сопоставьте соответственно начало строки и конец строки.
\(
и \)
используются для включения, subpattern1
чтобы мы могли ссылаться на него позже по специальному номеру \1
.
Они также используются для включения, subpattern2
чтобы мы могли повторить это 1 или более раз с квантификатором \+
.
subpattern1
is .*
.
- это метасимвол, соответствующий любому символу, кроме новой строки, и *
квантификатор, соответствующий последнему символу 0, 1 или более раз.
Таким образом, .*
соответствует любой текст, не содержащий новой строки.
subpattern2
is \n\1
\n
соответствует новой строке и \1
соответствует тому же тексту, который был найден внутри первой \(
, \)
что здесь subpattern1
.
Таким образом, pattern
можно прочитать так:
начало строки ( ^
), за которым следует любой текст, не содержащий новой строки ( .*
), за которым следует новая строка ( \n
), затем тот же текст ( \1
), причем последние два повторяются один или несколько раз ( \+
), и наконец конец строки ( $
) .
Везде, где pattern
сопоставляется (блок идентичных строк), команда подстановки заменяет его тем, string
что здесь \1
(первая строка блока).
Если вы хотите увидеть, какие блоки строк будут затронуты, ничего не изменяя в вашем файле, вы можете включить эту hlsearch
опцию и добавить n
флаг замещения в конце команды:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Для более детального контроля вы также можете запросить подтверждение перед изменением каждого блока строк, добавив c
вместо этого флаг подстановки:
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Для получения дополнительной информации о команде чтении подстановки :help :s
,
для замещения флагов :help s_flags
,
для различных метасимволов и кванторы чтения :help pattern-atoms
, так
и для регулярных выражения в Vim прочитать это .
Изменить: Подстановочный знак исправил проблему в команде, добавив $
в конце pattern
.
Также у BloodGain есть более короткая и читаемая версия этой же команды.
$
в этом, хотя. В противном случае он будет выполнять неожиданные действия со строкой, которая начинается с идентичного текста предыдущей строки, но содержит некоторые другие завершающие символы. Также обратите внимание, что основная команда, которую вы дали, функционально эквивалентна моему ответу:%!uniq
, но флаги выделения и подтверждения хороши.