Saya pikir perintah berikut harus bekerja:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Penjelasan:
Kami menggunakan perintah substitusi pada seluruh file untuk berubah pattern
menjadi string
:
:%s/pattern/string/
Berikut pattern
adalah ^\(.*\)\(\n\1\)\+$
dan string
adalah \1
.
pattern
dapat dipecah seperti ini:
^\(subpattern1\)\(subpattern2\)\+$
^
dan $
masing-masing cocok dengan awal garis dan akhir garis.
\(
dan \)
digunakan untuk melampirkan subpattern1
sehingga kita dapat merujuknya nanti dengan nomor khusus \1
.
Mereka juga digunakan untuk melampirkan subpattern2
sehingga kita dapat mengulanginya 1 atau lebih kali dengan kuantifier \+
.
subpattern1
adalah .*
.
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.
subpattern2
adalah \n\1
\n
cocok dengan baris baru dan \1
sesuai dengan teks yang sama yang disesuaikan dalam pertama \(
, \)
yang di sini adalah subpattern1
.
Jadi pattern
dapat 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 pattern
dicocokkan (blok dari garis yang identik), perintah substitusi menggantikannya dengan string
yang 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 hlsearch
opsi dan menambahkan n
flag 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 c
bendera 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.