N satırı sil 1 satır komut dosyasını atla


10

Ben sadece n satırları siler, 1 satır atlar ve belgenin sonuna kadar tekrarlar temel bir Vim komut dosyası oluşturmak istiyorum. Belirli eşleşmeleri umursamıyorum, sadece çizgiyi silmek istiyorum. Örneğin; Bu yüzden 3ddjtüm belge için komutu tekrarlamak istiyorum .

Text I want to keep.   
Text I want to delete.  
Text I want to delete.  
Text I want to delete.  
Text I want to keep.  
Text I want to delete.  
Text I want to delete.  
Text I want to delete.  
Text I want to keep.  
Text I want to delete.  
Text I want to delete.  
Text I want to delete.   

Görünüşe göre ...

Text I want to keep.  
Text I want to keep.  
Text I want to keep.  

Teşekkür ederim.


Etiketi regular-expressionsorunuza dahil ettiniz , ancak soru bunu normal ifadelerle yapmak için bir neden belirtmiyor gibi görünüyor. Aslında düzenli ifadeler kullanan bir şey arıyorsanız, stackoverflow.com/questions/17735289/… ilginizi çekebilir. Bu soru Notepad ++ ile ilgiliydi, ancak cevap pcre regex'ten başka bir şey kullanmıyor. (Feragat: Bu cevabı yazdım.)
Jasper

Bir dahaki sefere soru sorduğunuzda, "Bunun için teşekkürler. Harika bir çözüm!" her cevapta. Bu, bir yanıt üzerine yeni bir yorum oluşturmaya çalıştığınızda bile yazılır.
boru

Buna ek olarak, burada takdir göstermenin uygun yolu, sizin için en uygun cevabı kabul etmek ve yararlı veya yararlı bulduğunuz cevapları kaldırmaktır. İnsanlar bunu "teşekkürler" yorumundan çok görmeyi tercih eder.
B Layer

Yanıtlar:


19

Çok basit bir yaklaşım:

  1. Silmek istediğiniz ilk satıra gidin.
  2. Makro kaydetme: qa3ddjq
  3. Yüksek bir sayı ile tekrarlayın: 1000 @ a

Üçüncü adım, makroyu bin kez veya bir hatayla karşılaşılana kadar tekrarlayacaktır. Dosyanın sonuna vurmak (bu nedenle silinecek satır olmaması) bir hata üretir ve makronun tekrarı iptal edilir.

Bkz :help recording.


2
Thats inanılmaz !!! Çok teşekkür ederim, benim için çalıştı: D
Max Copley

1
açıklamalar: q(komut modunda ve vim'de veya diğer yeni alternatif sürümlerde [neovim, vb. ancak orijinal vi'da değil) “kaydetmeye başla ve 'sonraki harf' arabelleğine” koy. dolayısıyla: qa"a" arabelleğine kayıt başlat "anlamına gelir. Daha sonra bundan sonra yazılan her tuş qkaydedilir (komut modunda bir sonrakine kadar ) (hatta kayıt yapabilirsiniz: düzenleme moduna geçme, bir şey yazma, Komut moduna kaçma, vb.). Sonra 12@atampon "a" 12 kez kaydedilmiş ne olursa olsun eylemleri tekrar ediyorum.
Olivier Dulac

3
Ayrıca, 1000@qsonunda gibi bir şey çalıştırmak istemiyorsanız , özyinelemeli bir makro yapabilirsiniz: qa3ddj@aq@aancak, boş bir şekilde başlamak qaqiçin ilk önce yapmanız gerekebilir "a.
James

17

Benim için en kolay çözüm:

:%norm j3dd

Yani:

  • %: her satır için
  • norm: normal tuşlar gibi aşağıdaki tuşları çalıştırın
  • j3dd: hatta aşağı inin ve 3 satırı silin

İlk satırdan ikinci satıra inin ve sonraki 3 satırı silin. İkincisi Text I want to keep.şimdi ikinci satırda. Bir satır aşağı gidin, silin 3. Durulayın ve tekrarlayın.


Not: Dosyanın tamamını işlemek istemiyorsanız, %normile 5,$norm5. satırdan dosyanın sonuna kadar işlemek için ile değiştirebilirsiniz .


4
Çok güzel bir alternatif! Vim'de çalışır (vi değil). Daha önce hiç "norm" hakkında bir şey duymamıştım! (ve ben bir tür vi [m] inek)
Olivier Dulac

6

Zaten mevcut bazı harika çözümleriniz var. Işte başka biri:

:g/^/if line('.')%4!=1|:s/^/DELETE ME/|endif
:g/^DELETE ME/d

İlk olarak, (bir her satırda eylemi gerçekleştirmek :gkarşı eşleştirme ^(çizginin başlangıç)) ve her satır sayısı için sonucunu gerçekleştirmek linenumber % 4. Sonuç için eşit olmayan ise 1, biz eklemek DELETE MEhatları sonraki komutla silinecek işaretleme, satırın başında.

Bir sonraki komut, :gile başlayan DELETE MEve bunu yapan tüm satırlarla eşleşen normal ( ) bir komuttur .

Not: İlk :gkomutu kullanarak satırı hemen silemezsiniz , çünkü bu sonuçta ortaya çıkan modulo hesaplamasını değiştirir ve bu nedenle önce satırları işaretlememiz ve ikinci adımda onu silmemiz gerekir.


4

Bunun vikanal olduğunu biliyorum , ama bana göre bu bir sedproblem.

sed -ne 'p;n;n;n' <file >newfile

Böylece onu bir viçözüme dönüştürebilirsiniz :

:0
!Gsed -ne 'p;n;n;n'

1
Sed çözüm için +1.
Christian Brabandt

3

Bir alternatif (1 satırında başladığımızı ve örnek metne göre 2-4, 6-8 vb. Satırları sildiğimizi varsayalım):

while line(".") < line("$")
    silent +1delete _ 3
endwhile

Bunu etkileşimli olarak yapmayı tercih ediyorsanız, "komut satırı kaydı" nı kullanabilirsiniz. Yani, basın

:+1del 3<CR> ve sonra 1000@:


1

bir alternatif: herhangi bir satırı tutmak istersiniz: 1, 4, vb.

awk '!((FNR-1)%3)'  file > newfile
      # awk: when a condition is given without action:
      #        prints the lines for which the condition returns 0.
      # FNR designates the line number in the current file.
      # a%3 : takes the modulus of a and 3. ( 0%3=0, 1%3=1, 2%3=2, 3%3=0, 4%3=1, etc.) 
      # This will be 0 for 3, 6, etc. 
      # But we want it to be 0 (true) for 1, 4, etc : so we substract 1 to NR

# to see that it keeps those lines:
seq 1 20 | awk '!((NR-1)%3)'
1
4
7
10
13
16
19

başka bir alternatif: İstediğiniz çizgileri benzersiz bir desenle eşleştiriyorsanız:

# for exemple each line you want contains "some pattern":
fgrep "some pattern" file > newfile
# (or regular grep if you want "some pattern" to be interpreted as a regexp)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.