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ć pattern
na string
:
:%s/pattern/string/
Oto pattern
jest ^\(.*\)\(\n\1\)\+$
i string
jest \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, subpattern2
dzięki czemu możemy powtórzyć to 1 lub więcej razy z kwantyfikatorem \+
.
subpattern1
jest .*
.
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.
subpattern2
to \n\1
\n
pasuje do nowej linii i \1
pasuje ten sam tekst, który został dopasowany do środka pierwszy \(
, \)
który tutaj jest subpattern1
.
pattern
Moż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 pattern
jest dopasowany (blok identycznych linii), polecenie zamiany zastępuje go tym, string
co 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ę hlsearch
opcję i dodać n
flagę 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 c
zamiast 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.