Myślę, że następujące polecenie powinno działać:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Objaśnienie:
Używamy polecenia podstawienia dla całego pliku, aby zmienić patternna string:
:%s/pattern/string/
Oto patternjest ^\(.*\)\(\n\1\)\+$i stringjest \1.
pattern można podzielić w następujący sposób:
^\(subpattern1\)\(subpattern2\)\+$
^i $dopasuj odpowiednio początek linii i koniec linii.
\(i \)służą do załączenia subpattern1, abyśmy mogli odwołać się później do specjalnego numeru \1.
Są one również używane do zamykania, subpattern2dzięki czemu możemy powtórzyć to 1 lub więcej razy z kwantyfikatorem \+.
subpattern1jest .*
.metaznakiem pasującym do dowolnego znaku z wyjątkiem nowej linii i *jest kwantyfikatorem, który pasuje do ostatniego znaku 0, 1 lub więcej razy. Dopasowuje
więc .*dowolny tekst nie zawierający nowej linii.
subpattern2to \n\1
\npasuje do nowej linii i \1pasuje ten sam tekst, który został dopasowany do środka pierwszy \(, \)który tutaj jest subpattern1.
patternMożna więc odczytać w ten sposób:
początek wiersza ( ^), po którym następuje dowolny tekst nie zawierający nowej linii ( .*), a następnie nowy wiersz ( \n), a następnie ten sam tekst ( \1), przy czym dwa ostatnie są powtarzane raz lub więcej razy ( \+), oraz wreszcie koniec linii ( $) .
Gdziekolwiek patternjest dopasowany (blok identycznych linii), polecenie zamiany zastępuje go tym, stringco jest tutaj \1(pierwsza linia bloku).
Jeśli chcesz zobaczyć, które bloki linii zostaną zmienione bez zmiany czegokolwiek w pliku, możesz włączyć tę hlsearchopcję i dodać nflagę podstawienia na końcu polecenia:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Aby uzyskać bardziej szczegółową kontrolę, możesz również poprosić o potwierdzenie przed zmianą każdego bloku linii, dodając czamiast tego flagę podstawienia:
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Aby uzyskać więcej informacji na temat poleceń odczytu podstawienia :help :s,
dla flagi podmiany :help s_flags,
na różne metaznakami i kwantyfikatory czytać :help pattern-atoms,
a dla wyrażenia regularne w vim czytać tego .
Edycja: symbol wieloznaczny naprawił problem w poleceniu, dodając $na końcu pattern.
Również BloodGain ma krótszą i bardziej czytelną wersję tego samego polecenia.
$w tym. W przeciwnym razie zrobi nieoczekiwane rzeczy z linią, która zaczyna się identycznym tekstem jak poprzednia linia, ale ma inne końcowe znaki. Zauważ też, że podstawowe polecenie, które wydałeś, jest funkcjonalnie równoważne z moją odpowiedzią:%!uniq, ale flagi wyróżnienia i potwierdzenia są ładne.