Cari string dan hitung di editor vi

105

Saya ingin mencari string dan menemukan jumlah kejadian dalam sebuah file menggunakan editor vi.

kadeshpa
sumber
11
Jawaban yang dipilih ( :g/xxxx/d) buruk, berbahaya, dan lebih rendah dari yang lain di halaman ini. Harap batalkan pilihannya.
Bruno Bronosky
1
saya setuju dan itu hanya memberitahu Anda 'baris dihapus' bukan 'kejadian dihapus'
pengguna1709076

Jawaban:

4
:g/xxxx/d

Ini akan menghapus semua baris dengan pola, dan melaporkan berapa banyak yang dihapus. Urungkan untuk mendapatkannya kembali setelahnya.

Kevin Beck
sumber
6
Tentu saja, dia bisa menghilangkan "d" jadi dia tidak perlu melakukan operasi.
Benteng
15
Perhatikan bahwa ini hanya memberi tahu Anda berapa banyak baris - bukan berapa banyak kemunculan. Saya pikir dirk adalah solusi yang lebih baik.
4
Solusi saya di bawah ini dengan benar menghitung beberapa kejadian dalam satu baris dan tidak ada yang perlu dibatalkan.
Mohit Chakraborty
6
Sangat Berbahaya: o
Ankit Zalani
1
Ini tidak seharusnya menjadi jawaban yang diterima / paling populer. Apa yang dilakukan oleh SO Moderator? :(
user1412066
181

THE caranya

:% s / pattern // gn

Gustavo
sumber
2
Ini adalah jawaban paling otentik tanpa menggunakan trik over-kill.
pengguna1412066
1
jawaban terbaik!
Paulo Luvisoto
121

Anda membutuhkan nbenderanya. Untuk menghitung kata-kata gunakan:

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

dan kata tertentu:

:%s/the/&/gn        

Lihat count-itemsbagian dokumentasi.

Jika Anda cukup mengetik:

%s/pattern/pattern/g

maka baris status akan memberi Anda jumlah pertandingan di vi juga.

dirkgently
sumber
Sepertinya jawaban ini untuk pengguna Vim dan bukan untuk Vi :(
kadeshpa
Apakah Anda hanya memiliki vi di sistem Anda? Versi yang mana
dirkgently
Seseorang menandai pertanyaan Anda dengan vim di dalamnya ... Saya menghapusnya.
ojblass
38

:% s / string / string / g akan memberikan jawabannya.

Mohit Chakraborty
sumber
Jawaban yang lebih baik. +5 jika memungkinkan
ojblass
Saya kira ini hanya akan berhasil jika tidak ada '. *' Yang digunakan dalam pola
AK
10
Tidak perlu mengulang string, lakukan saja %s/string//ng.
slm
23

(mirip seperti yang dikatakan Gustavo, tetapi sebagai tambahan:)

Untuk pencarian sebelumnya , Anda dapat melakukannya dengan mudah:

:%s///gn

Pola tidak diperlukan, karena sudah ada di search-register ( @/).

"%" - lakukan s/di seluruh file
"g" - cari global (dengan beberapa klik dalam satu baris)
"n" - mencegah penggantian apa puns/ - tidak ada yang dihapus! tidak ada yang harus dibatalkan!
(lihat: :help s_flaguntuk informasi lebih lanjut)

(Dengan cara ini, ini berfungsi sempurna dengan " Telusuri teks yang dipilih secara visual ", seperti yang dijelaskan di vim-wikia tip171 )

tron5
sumber
3

menggunakan

:% s / pola / \ 0 / g

ketika pola string terlalu panjang dan Anda tidak suka mengetik semuanya lagi.

Sungwon Jeong
sumber
1

Jawaban singkatnya :

:% s / string-untuk-dicari // gn

Untuk belajar :

Ada 3 mode dalam editor VI seperti di bawah ini masukkan deskripsi gambar di sini

  • :Anda masuk dari Commandke Command-linemode. Sekarang, apa pun yang Anda tulis setelahnya :ada di CLI (Command Line Interface)
  • %smenentukan semua baris. Menentukan rentang sebagai %cara melakukan substitusi di seluruh file. Sintaks untuk semua substitusi kemunculan adalah:%s/old-text/new-text/g
  • gmenentukan semua kejadian di baris. Dengan adanya gbendera tersebut, Anda dapat membuat seluruh baris diganti. Jika gflag ini tidak digunakan maka hanya kemunculan pertama di baris saja yang akan diganti.
  • n menentukan jumlah keluaran dari kejadian
  • //garis miring ganda melambangkan penghilangan replacement text. Karena kami hanya ingin mencari.

Setelah mendapatkan jumlah kemunculannya, Anda dapat Tekan NTombol untuk melihat kejadian satu per satu.

Untuk mencari dan menghitung dalam rentang tertentu dari nomor baris 1 sampai 10:

: 1,10s / halo // gn

  • Harap dicatat, %untuk seluruh file diganti dengan ,nomor baris yang dipisahkan.

Untuk menemukan dan mengganti dalam rentang tertentu dari baris nomor 1 sampai 10:

: 1,10s / helo / hello / gn

Om Sao
sumber
0

Saya sarankan melakukan:

  1. Cari dengan *untuk melakukan "pencarian terbatas" untuk apa yang ada di bawah kursor, atau melakukan /patternpencarian standar .
  2. Gunakan :%s///gnuntuk mendapatkan jumlah kemunculan. Atau Anda bisa menggunakan :%s///nuntuk mendapatkan jumlah baris dengan kejadian.

** Saya benar-benar dengan saya dapat menemukan plug-in yang akan memberikan pesan "cocok N dari N 1 pada N 2 baris" dengan setiap pencarian, tapi sayangnya.

Catatan: Jangan bingung dengan kata-kata yang rumit dari keluarannya. Perintah pertama mungkin memberi Anda sesuatu seperti di 4 matches on 3 linesmana perintah terakhir mungkin memberi Anda 3 matches on 3 lines. Meskipun secara teknis akurat, yang terakhir menyesatkan dan harus mengatakan '3 baris cocok'. Jadi, seperti yang Anda lihat, sebenarnya tidak perlu menggunakan bentuk yang terakhir (hanya 'n'). Anda mendapatkan info yang sama, lebih jelas, dan lebih banyak dengan menggunakan formulir 'gn'.

Bruno Bronosky
sumber