Saya pikir perintah berikut harus bekerja:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Penjelasan:
Kami menggunakan perintah substitusi pada seluruh file untuk berubah patternmenjadi string:
:%s/pattern/string/
Berikut patternadalah ^\(.*\)\(\n\1\)\+$dan stringadalah \1.
pattern dapat dipecah seperti ini:
^\(subpattern1\)\(subpattern2\)\+$
^dan $masing-masing cocok dengan awal garis dan akhir garis.
\(dan \)digunakan untuk melampirkan subpattern1sehingga kita dapat merujuknya nanti dengan nomor khusus \1.
Mereka juga digunakan untuk melampirkan subpattern2sehingga kita dapat mengulanginya 1 atau lebih kali dengan kuantifier \+.
subpattern1adalah .*
.metacharacter yang cocok dengan karakter apa pun kecuali baris baru dan *merupakan penjumlah yang cocok dengan karakter terakhir 0, 1 atau lebih kali.
Jadi .*cocok dengan teks apa pun yang tidak mengandung baris baru.
subpattern2adalah \n\1
\ncocok dengan baris baru dan \1sesuai dengan teks yang sama yang disesuaikan dalam pertama \(, \)yang di sini adalah subpattern1.
Jadi patterndapat dibaca seperti ini:
awal baris ( ^) diikuti oleh teks yang tidak mengandung baris baru ( .*) diikuti oleh baris baru ( \n) kemudian teks yang sama ( \1), dua baris terakhir diulang satu atau lebih kali ( \+), dan akhirnya sebuah akhir baris ( $) .
Di mana pun patterndicocokkan (blok dari garis yang identik), perintah substitusi menggantikannya dengan stringyang di sini adalah \1(baris pertama dari blok).
Jika Anda ingin melihat blok garis mana yang akan terpengaruh tanpa mengubah apa pun di file Anda, Anda bisa mengaktifkan hlsearchopsi dan menambahkan nflag substitusi di akhir perintah:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Untuk kontrol yang lebih terperinci, Anda juga dapat meminta konfirmasi sebelum mengubah setiap blok garis dengan menambahkan cbendera pengganti sebagai gantinya:
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Untuk informasi lebih lanjut tentang perintah substitusi baca :help :s,
untuk bendera substitusi :help s_flags,
untuk berbagai metachar karakter dan quantifier dibaca :help pattern-atoms,
dan untuk ekspresi reguler dalam vim baca ini .
Sunting: Wildcard memperbaiki masalah dalam perintah dengan menambahkan a $di akhir pattern.
BloodGain juga memiliki versi yang lebih pendek dan lebih mudah dibaca dari perintah yang sama.
$di dalamnya, meskipun. Kalau tidak, ia akan melakukan hal-hal yang tidak terduga dengan garis yang dimulai dengan teks yang identik dengan baris sebelumnya, tetapi memiliki beberapa karakter tambahan lainnya. Perhatikan juga bahwa perintah dasar yang Anda berikan secara fungsional setara dengan jawaban saya:%!uniq, tetapi flag highlight dan konfirmasi bagus.