Yanıtlar:
Vim's: g komutu tam olarak bu tür görevler için tasarlanmıştır; belirli bir desene uyan her satırda tek bir işlem yürütmek. İşte cevabım:
:g/.\n\n\@!/norm o
Kullandığım desen /.\n\n\@!/
. Bunu parça parçalarına ayırmak:
.
Satırdaki herhangi bir karakterle eşleşir. (varolan boş satırları dikkate almamak için hemen kullanılır)\n
Yukarıdaki karakterin sonunda tek bir \ n ile eşleşir\n\@!
\ N başından hemen sonra başka bir \ n varsa eşleşme başarısız olur.( Normal ifadelerde :h E59
daha fazla bilgi \@!
ve benzer eşleşme belirteçleri olup olmadığını kontrol edin - birkaç tane daha var!)
Yani: g komutunun normal ifadesi artık tek bir satırsonu tarafından sonlandırılan ve ardından boş bir satır olmayan boş olmayan her satırı seçti.
Bir ifadedeki desenden sonra :g
eşleşen satırlarda çalıştırma komutu gelir. Bu durumda, normal mod komutunu (kısaltılmış norm
) çalıştırmasını söyledim ve çalıştırılacak komut basitçe o
, geçerli satırın altına boş bir satır ekler.
Böylece birlikte ele alındığında, komut altında boş bir satır olmayan her satırı bulur ve bir satır ekler. Ve hepsi bu kadar! Yapabileceğiniz daha süslü şeyler için vim wiki'nin Gücü Gücü makalesini kontrol etmek isteyebilirsiniz :g
(ve negatif kız kardeşi :v
) - yakında güvenebileceğiniz ve faydalı olarak editörlerde çok özlediğiniz şaşırtıcı kullanışlı komutlardan biridir. ki buna sahip değil.
:%s/$/
, ardından vurun ^V
, sonra vurun Enter
.
:%s/$/<C-V><CR><CR>
( Anahtar basışlarının ortak vim-folk kodlamasını kullanmak için) demek istediğinizi varsayarsak , bu yaklaşım her satırdan sonra yeni bir satır ekler. Yani, zaten boşluklarla ayrılmış satırlar (örnek metinde Satır 3 -> Satır 4'e bakın) ekstra boş satırlar alır. Orijinal soru, başlangıç metninde zaten var olan ekstra boş satırlar eklemekten kaçınmaktı.
@ NeilForester'ın küresel arama ve değiştirme cevabını test ettiğimde, satırların her birinde yalnızca bir karakter olması durumunda ardışık boş olmayan satırlarda her saniye değiştirilen yerini kaçırdığını buldum. Bunun nedeni , önceki durumla eşleştiği son karakterden sonra her bir durumda eşleşmeye başlayan paternden kaynaklanıyor gibi görünüyor .
Lookbehind ve lookahead kullanımı bu sorunu çözer ve normal ifadeyi de biraz daha kısaltır:
:%s/\n\@<!\n\n\@!/\r\r/g
\n\@<!\n
başka bir linebreak'den hemen sonra olmayan herhangi bir linebreak anlamına gelir mi? Ama ne \n\@!
anlama geldiğini anlayamadım . Öğrenmek ve diğer arama modellerine uygulamak için anlamak istiyorum :)
\n\@<!\n
başka bir satır kesmesini hemen takip etmeyen herhangi bir satır sonu anlamına gelir. \n\@!
önceki atom (yani \n
), aşağıdakilerden hemen önce eşleşmezse sıfır genişliğiyle eşleşir . :help \@<!
Bununla ilgili belgeleri vim'de görmeye çalışın . I
Eğer Yanlışsam beni düzelt. Bir satır aşağı gitmek için komut modundayken k harfini kullandığınıza inanıyorum. Ardından ekleme moduna girin ve sonraki satırı ekleyin. Gerektiği kadar tekrarlansın mı? Bu yardımcı olur umarım!
k
bir satır yukarı taşır. j
bir satır aşağı taşır.
/[^\n]\n[^\n]
:map <F2> no<esc><F2>
Sonra tuşuna basın <F2>
. Bu, art arda iki boş olmayan satır arar ve ardından art arda aralarına bir satır ekler.
Düzenle:
İşte bunu tek bir global arama ve değiştirme ile yapmanın alternatif bir yolu:
:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g
Bu komutu deneyin ( 16
karakterler):
:%!sed G|cat -s
:%norm o
ancak bu durumun amaçlandığı gibi çalışmadığı ortaya çıkaro
. +1