Vi düzenleyicide dize arayın ve sayın


105

Vi düzenleyicisini kullanarak bir dizge aramak ve bir dosyadaki oluşum sayısını bulmak istiyorum.


11
Seçilen cevap ( :g/xxxx/d) korkunç, tehlikeli ve bu sayfadaki diğerlerine göre daha düşük. Lütfen seçimini kaldırın.
Bruno Bronosky

1
Kabul

Yanıtlar:


4
:g/xxxx/d

Bu, desenli tüm satırları silecek ve kaçının silindiğini bildirecektir. Onları daha sonra geri almak için geri alın.


6
Tabii ki, "d" harfini atlayabilir, böylece operasyona girmek zorunda kalmaz.
Kale

15
Bunun yalnızca kaç satır olduğunu söyler - kaç tane geçtiğini değil. Bence dirk's daha iyi bir çözüm.

4
Aşağıdaki çözümüm, bir satırdaki birden çok oluşumu doğru bir şekilde sayıyor ve geri alınacak hiçbir şey yok.
Mohit Chakraborty

6
Çok Tehlikeli: o
Ankit Zalani

1
Bunun kabul edilen / en popüler cevap olmaması gerekiyor. SO Moderatörleri ne yapıyor? :(
user1412066


121

nBayrağa ihtiyacın var . Kelimeleri saymak için şunu kullanın:

:%s/\i\+/&/gn   

ve belirli bir kelime:

:%s/the/&/gn        

Bkz count-itemsdokümantasyon bölümüne.

Sadece yazarsanız:

%s/pattern/pattern/g

sonra durum satırı size vi'deki eşleşme sayısını da verecektir.


Görünüşe göre bu cevap Vi için değil Vim kullanıcıları için :(
kadeshpa

Sisteminizde sadece vi var mı? Hangi versiyon?
Dirkgently

Biri sorgunuzu içinde vim ile etiketledi ... Ben kaldırdım.
ojblass

38

:% s / string / string / g cevabı verecektir.


Ne daha iyi bir cevap. Mümkünse +5
ojblass

Sanırım bu modelde ". *" Kullanılmadığında işe yarayacaktır
AK

10
Dizeyi tekrar etmeye gerek yok, sadece yap %s/string//ng.
slm

23

(Gustavo'nun dediği gibi, ama ek olarak:)

Daha önce yapılan herhangi bir arama için şunları yapabilirsiniz:

:%s///gn

Zaten arama kaydında ( @/) olduğu için bir modele gerek yoktur .

"%" - s/tüm dosyada yap
"g" - global ara (tek satırda birden çok isabet ile)
"n" - herhangi bir değiştirmeyi önler s/- hiçbir şey silinmez! hiçbir şey geri alınmamalıdır!
(bkz: :help s_flagdaha fazla bilgi için)

(Bu şekilde, vim-wikia tip171'de açıklandığı gibi " Görsel olarak seçilmiş metni ara " ile mükemmel çalışır )


3

kullanım

:% s / desen / \ 0 / g

desen dizesi çok uzun olduğunda ve hepsini tekrar yazmaktan hoşlanmadığınızda.


1

Kısa cevap :

:% s / aranacak dizge // gn

Öğrenmek için :

VI editöründe aşağıdaki gibi 3 mod vardır görüntü açıklamasını buraya girin

  • :Eğer gelen giriyoruz Commandiçin Command-linemod. Şimdi ne yazarsanız yazın :CLI'de (Komut Satırı Arayüzü)
  • %stüm satırları belirtir. Aralığın belirtilmesi, %tüm dosyada değişiklik yapmak anlamına gelir. Tüm oluşumların sözdizimi ikame:%s/old-text/new-text/g
  • gsatırdaki tüm oluşumları belirtir. İle gbayrak, tüm hat ikame edilecek yapabilirsiniz. Bu gbayrak kullanılmazsa, yalnızca satırdaki ilk geçtiği yer değiştirilecektir.
  • n oluşum sayısını çıktı olarak belirtir
  • //çift ​​eğik çizgi, eksikliğini temsil eder replacement text. Çünkü sadece bulmak istiyoruz.

Olay sayısını aldıktan sonra, Nolayları tek tek görmek için Tuşa basabilirsiniz .

Özellikle 1 ila 10 numaralı satır aralığını bulmak ve saymak için:

: 1,10s / merhaba // gn

  • Lütfen %tüm dosya için ,ayrı satır numaralarıyla doldurulduğunu unutmayın .

Özellikle 1 ila 10 numaralı satır aralığını bulmak ve değiştirmek için:

: 1,10s / helo / merhaba / gn


0

Yapmanızı öneririm:

  1. Biriyle ara *imlecin altında veya standart ne için bir "sınırlı arama" yapmak için /patternarama.
  2. Gerçekleşme :%s///gnsayısını öğrenmek için kullanın . Veya :%s///ntekrarlanan satırların sayısını elde etmek için kullanabilirsiniz .

** Gerçekten birlikte her aramada " N 2 satırda N 1 N ile eşleş" mesajını veren bir eklenti bulabilirdim , ama ne yazık ki.

Not: Çıktının aldatıcı ifadeleriyle kafanızı karıştırmayın. İlk komut size 4 matches on 3 lines, ikincisinin size verebileceği gibi bir şey verebilir 3 matches on 3 lines. Teknik olarak doğru olsa da , ikincisi yanıltıcıdır ve '3 satır eşleşiyor' demelidir. Gördüğünüz gibi, ikinci (yalnızca 'n') biçimini kullanmaya gerçekten hiç gerek yok. Aynı bilgileri daha net ve daha fazlasını 'gn' formunu kullanarak alırsınız.

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.