Penso che il seguente comando dovrebbe funzionare:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Spiegazione :
Usiamo il comando di sostituzione sull'intero file per cambiare pattern
in string
:
:%s/pattern/string/
Qui pattern
è ^\(.*\)\(\n\1\)\+$
ed string
è \1
.
pattern
può essere suddiviso in questo modo:
^\(subpattern1\)\(subpattern2\)\+$
^
e $
abbinare rispettivamente un inizio di riga e una fine di riga.
\(
e \)
vengono utilizzati per racchiudere in subpattern1
modo che possiamo fare riferimento ad esso in seguito dal numero speciale \1
.
Sono anche usati per racchiudere in subpattern2
modo che possiamo ripeterlo 1 o più volte con il quantificatore \+
.
subpattern1
is .*
.
è un metacarattere che corrisponde a qualsiasi carattere tranne la nuova riga ed *
è un quantificatore che corrisponde all'ultimo carattere 0, 1 o più volte.
Quindi .*
corrisponde a qualsiasi testo che non contiene alcuna nuova riga.
subpattern2
è \n\1
\n
corrisponde una nuova riga e \1
corrisponde lo stesso testo che è stato abbinato all'interno della prima \(
, \)
che qui è subpattern1
.
Quindi pattern
può essere letto in questo modo:
un inizio di riga ( ^
) seguito da qualsiasi testo che non contiene alcuna nuova riga ( .*
) seguito da una nuova riga ( \n
) quindi dallo stesso testo ( \1
), gli ultimi due che si ripetono una o più volte ( \+
), e finalmente un fine riga ( $
) .
Ovunque pattern
sia abbinato (un blocco di linee identiche), il comando di sostituzione lo sostituisce con quello string
qui \1
(la prima riga del blocco).
Se vuoi vedere quali blocchi di linee saranno interessati senza cambiare nulla nel tuo file, puoi abilitare l' hlsearch
opzione e aggiungere il n
flag di sostituzione alla fine del comando:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Per un controllo più granulare, puoi anche chiedere una conferma prima di modificare ogni blocco di linee aggiungendo c
invece il flag di sostituzione:
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Per ulteriori informazioni sul comando di lettura di sostituzione :help :s
,
per le bandiere di sostituzione :help s_flags
,
per i vari metacaratteri e quantificatori leggere :help pattern-atoms
,
e per le espressioni regolari in vim leggono questo .
Modifica: il carattere jolly ha risolto un problema nel comando aggiungendo un $
alla fine di pattern
.
Anche BloodGain ha una versione più breve e più leggibile dello stesso comando.
$
in esso, però. Altrimenti farà cose inaspettate con una riga che inizia con un testo identico alla riga precedente, ma ha alcuni altri caratteri finali. Nota anche che il comando di base che hai dato è funzionalmente equivalente alla mia risposta:%!uniq
, ma i flag di evidenziazione e di conferma sono buoni.