Я думаю, что следующая команда должна работать:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Пояснение:
Мы используем команду замещения для всего файла, чтобы изменить patternна string:
:%s/pattern/string/
Вот patternэто ^\(.*\)\(\n\1\)\+$и stringесть \1.
pattern может быть разбито так:
^\(subpattern1\)\(subpattern2\)\+$
^и $сопоставьте соответственно начало строки и конец строки.
\(и \)используются для включения, subpattern1чтобы мы могли ссылаться на него позже по специальному номеру \1.
Они также используются для включения, subpattern2чтобы мы могли повторить это 1 или более раз с квантификатором \+.
subpattern1is .*
.- это метасимвол, соответствующий любому символу, кроме новой строки, и *квантификатор, соответствующий последнему символу 0, 1 или более раз.
Таким образом, .*соответствует любой текст, не содержащий новой строки.
subpattern2is \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, но флаги выделения и подтверждения хороши.