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 patterniçine string:
:%s/pattern/string/
İşte patternolan ^\(.*\)\(\n\1\)\+$ve stringolduğ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\+
subpattern1olan .*
.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.
subpattern2olan \n\1
\nyeni bir satır eşleşir ve \1ilk 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 patterneşleşen (aynı çizgiler bir blok) olup, ikame komutu ile değiştirir stringburada 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, hlsearchseçeneği etkinleştirebilir nve komutun sonuna ikame bayrağını ekleyebilirsiniz :
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Daha ayrıntılı denetim için, cbunun 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.