Aşağıdaki komutun çalışması gerektiğini düşünüyorum:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Açıklama:
Biz değişime bütün dosya üzerinde ikame komutunu kullanın pattern
içine string
:
:%s/pattern/string/
İşte pattern
olan ^\(.*\)\(\n\1\)\+$
ve string
olduğunu \1
.
pattern
şu şekilde parçalanabilir:
^\(subpattern1\)\(subpattern2\)\+$
^
ve $
sırasıyla bir satır başı ve bir satır sonu eşleşir.
\(
ve daha sonra özel numarayla başvurabilmemiz \)
için kuşatmak için kullanılır .
Ayrıca , niceleyici ile 1 veya daha fazla kez tekrarlayabilmemiz için kuşatmak için kullanılırlar .subpattern1
\1
subpattern2
\+
subpattern1
olan .*
.
yeni satır hariç herhangi bir karakter eşleşen meta karakterdir ve *
son karaktere 0, 1 veya daha fazla kez eşleşen bir miktar belirleyici olduğunu.
Dolayısıyla, .*
yeni satır içermeyen herhangi bir metni eşleştirir.
subpattern2
olan \n\1
\n
yeni bir satır eşleşir ve \1
ilk iç eşleşti aynı metinle eşleşen \(
, \)
burada hangi subpattern1
.
Bu pattern
şekilde şu şekilde okunabilir:
satırın başlangıcı ( ^
) ve ardından yeni satır içermeyen herhangi bir metin ( .*
) ve ardından yeni satır ( \n
), sonra aynı metin ( \1
), sonuncusu bir veya daha fazla kez tekrarlanır ( \+
) ve nihayet satır sonu ( $
) .
Her yerde pattern
eşleşen (aynı çizgiler bir blok) olup, ikame komutu ile değiştirir string
burada hangi \1
(bloğun ilk çizgi).
Dosyanızda hiçbir şeyi değiştirmeden hangi satır bloklarının etkileneceğini görmek istiyorsanız, hlsearch
seçeneği etkinleştirebilir n
ve komutun sonuna ikame bayrağını ekleyebilirsiniz :
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Daha ayrıntılı denetim için, c
bunun yerine ikame bayrağını ekleyerek her bir satır bloğunu değiştirmeden önce bir onay isteyebilirsiniz :
:%s/^\(.*\)\(\n\1\)\+$/\1/c
İkame komut okuma hakkında daha fazla bilgi için :help :s
,
ikame Bayraklar için :help s_flags
,
çeşitli meta ve nicelik okumak için :help pattern-atoms
,
ve için vim normal ifadeler okumak bu .
Düzenleme: Joker$
, sonuna bir ekleyerek komuttaki bir sorunu düzeltti pattern
.
Ayrıca BloodGain aynı komutun daha kısa ve daha okunabilir bir versiyonuna sahiptir.
$
ama emrinizde bir a lazım. Aksi takdirde , bir önceki satıra özdeş metinle başlayan , ancak diğer sondaki karakterleri olan bir satırla beklenmedik şeyler yapar . Ayrıca, verdiğiniz temel komutun cevabımla işlevsel olarak eşdeğer olduğunu:%!uniq
, ancak vurgulama ve onay bayraklarının güzel olduğunu unutmayın.