Dosyadaki bir kelimenin oluşumunu saymanın bir yolu var mı?


68

Bir dosyada bir kelimenin veya desenin kaç kez göründüğünü saymak mümkün mü? Bu, bir fonksiyonun kaç kez çağrıldığını vb. Bulmak için bazen yararlıdır.


Yanıtlar:


93

Quincy'nin cevabı gayet iyi, ancak bunu yapmanın kesin bir yolu var; bu da tamponu düzenlemeyi gerektirmiyor:

:%s/pattern//ng

Bu, gibi bir ileti yazdırır 3 matches on 2 linesve arabellekte hiçbir değişiklik yapılmayacak.

nBayrak yapan :substitutekomut gerçek bir ikame yapmak yerine eşleşme sayısını yazdırmak; gbayrak her satırda birden maçların raporlamasını sağlar.


Kullanım durumunuz için faydalı olabilecek başka bir şey, bir desene uyan tüm satırları yazdırmaktır:

:global/pattern/print

Bu kısaltılabilir:

:g/pattern

Bu, :globalkomutun en basit kullanımlarından biridir (ki dikkat çekici derecede güçlüdür). Sadece eşleşen tüm satırları yazdıracak patternve sonra (birden fazla satır varsa) Enteruzaklaşmak için başka bir komutu basacak veya yazacaksınız.

Biraz önemsiz: Bu komut, grepgenellikle "normal ifade" anlamına g/re/pgeldiği şekilde tanımlandığı gibi adın kökenidir re.


2
+1 Bu, yerinde ve aynı zamanda oldukça ayrıntılı olan oldukça hoş bir cevap. Diyelim ki çoğu soru böyle cevaplar alabilsin! :)
yo '

Harika cevap ve inanılmaz bilgiler!
BiBi

Bunu yılda 2-3 kez yapmak zorundayım ve sözdizimini asla hatırlamıyorum, bu yüzden her seferinde arama makinesine geliyor. Sadece bu açık cevap için teşekkür etmek istedim, çünkü bir kereden fazla benim için oradaydı ve birkaç yıldan beri beni o korkunç wikia sayfasında kurtardı! (wikia değil sayfanın içeriği)
Will

1
Küçük bit: komut g/re/paslında eddeğil, değil vi. Grep, birkaç yıl önce vi'yi öldürür.
Will

Bir var nnoremap <leader>n :%s///gn<CR>eşleme. Bu yüzden <leader>ndaha önce aranan desenin oluşumunu saymak için basın . Bunu şaşırtıcı derecede sık kullanıyorum.
Rolf

15

:%s/pattern//nSondaki nbayrak, :skomuta, eşleşmelerin sayısını bildirir ve gerçekte yerine geçenleri bildirir . :h :s_flagsDaha fazla bilgi için okuyun .


4
Öyle değil mi gn?
yo

1
@ yo 'Evet, g başka bir bayrak olsa da, gher satıra birden fazla eşleşme olabileceğini düşünüyorsanız, bu genellikle doğrudur. Ancak sorunun amacı için bayrak ndaha önemlidir.
Dhruva Sagar

5

Önce /bir regex aramak, sonra

:%s///gn

Bu, Dhurva'nın cevabı ile aynıdır, ancak a.) Kullanımı daha kolaydır (regex'in önce ne eşleştiğinin sonuçlarını önizleyebildiğiniz için) ve b.) Tüm oluşumları gsaymak için genel olarak bayrakla eşleşir .



2

:%s/pattern//g

Durum çubuğunda değişiklik sayısını göreceksiniz. Bu kaç kez patternbelirir. Sonra udeğiştirmeleri geri almak için sadece basın .


1

Buradaki cevaplara dayanarak .vimrc'ime eklediğim bir eşleme:

" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>

" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>

Biraz daha açıklama, umarım yeni vimmers için faydalıdır:

  • <c-r><c-w> sözcüğü imlecin altına komut satırında ekler, birçok durumda kullanışlıdır.

  • <c-u>Otomatik olarak eklenir kaldırmak için gereklidir '<,'> basıldığında :görsel modunda ve komut satırına giderek. *Yazmacı (son) görsel seçimi içeren <c-r>* içeriklerini ekler *(aynı zamanda ekleme modunda kullanılabilir) komut doğrultusunda kayıt.

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.