Penso che il seguente comando dovrebbe funzionare:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Spiegazione :
Usiamo il comando di sostituzione sull'intero file per cambiare patternin 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 subpattern1modo che possiamo fare riferimento ad esso in seguito dal numero speciale \1.
Sono anche usati per racchiudere in subpattern2modo che possiamo ripeterlo 1 o più volte con il quantificatore \+.
subpattern1is .*
.è 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
\ncorrisponde una nuova riga e \1corrisponde lo stesso testo che è stato abbinato all'interno della prima \(, \)che qui è subpattern1.
Quindi patternpuò 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 patternsia abbinato (un blocco di linee identiche), il comando di sostituzione lo sostituisce con quello stringqui \1(la prima riga del blocco).
Se vuoi vedere quali blocchi di linee saranno interessati senza cambiare nulla nel tuo file, puoi abilitare l' hlsearchopzione e aggiungere il nflag 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 cinvece 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.