Kemungkinan Duplikat:
Cari pola teks di linux
Dalam bash, saya bertanya-tanya apakah ada perintah yang akan memberi tahu Anda jika string tertentu yang Anda cari ada di dalam file yang terletak di direktori saat ini Anda berada.
Katakanlah Anda mencari fungsi 'toUpperCase ()' dalam satu set file C di direktori Anda saat ini. Ada banyak file, jadi Anda tidak ingin membukanya secara manual menggunakan vim dan memeriksa string 'toUpperCase' karena itu akan memakan banyak waktu. Jika bukan bash command line, apakah ada metode lain untuk melakukan ini secara efisien?
Alat pencarian teks standar adalah grep .
Untuk mencari string
toUpperCase(
di semua.c
file di direktori saat ini:Jika Anda ingin mencari di subdirektori juga:
Jika Anda mencari panggilan fungsi C, maka ctag mungkin lebih cocok. Anda menjalankannya sekali pada semua file sumber Anda untuk membuat indeks pengidentifikasi, lalu gunakan editor Anda untuk bernavigasi di antara panggilan. Semua editor mirip vi dapat menggunakan
TAGS
file ctags . Jika Anda menggunakan Emacs, jalankan program serupaetags
.sumber
ctags
berguna untuk menemukan definisi fungsi , bukan panggilan fungsi .Anda menggunakan vim. Anda punya alat untuk melakukan ini.
Bisa ditebak, ada tujuh jawaban yang sudah mengatakan untuk digunakan
grep
. Tetapi saya tampaknya menjadi satu-satunya orang yang sejauh ini telah memperhatikan dari pertanyaan Anda yang Anda gunakanvim
. Dengan demikian, meskipun Anda dapat menggunakangrep
dari dalamvim
, Anda juga dapat menggunakanvim
alat bawaan. Ini dipanggil melalui:vimgrep
perintah.Untuk mencari "semua file sumber C di direktori saat ini untuk panggilan ke fungsi
toUpperCase()
" satu ketikvim
perintahDaftar kecocokan yang dihasilkan secara otomatis dimuat ke dalam daftar perbaikan cepat, dapat diakses dengan salah satu dari (lihat bantuan on-line untuk perbedaan halus)
Untuk menemukan definisi fungsi , bukan panggilan ke sana,
ctags
adalah alat, seperti yang disebutkan dalamGilles
jawaban , dalam hubungannya dengan perintah:tjump
atau:tselect
.Mengapa menggunakan
:vimgrep
?Bantuan online (
:help grep
) menyebutkan beberapa alasan, yang saya tidak akan nuri di sini. Lebih jauh dari itu, bandingkan tindakan:vimgrep
dengandietbuddha
jawaban .dietbuddha
Baris perintah memotonggrep
proses individu untuk setiap file sumber C individu. Bahkan tidak digunakanxargs
untuk mengurangi overhead itu. Dan Anda masih harus mem-parsing output untuk memanggil editor teks Anda pada file sumber yang relevan setelah selesai.:vimgrep
tidak memotong beberapa proses tambahan sama sekali, dan menggunakan hasilnya adalah kesederhanaan itu sendiri. Hanya memilih salah satu entri dalam daftar perbaikan cepat yang dihasilkan secara otomatis menempatkan kursor pada baris yang relevan dari file sumber yang relevan.Bahkan, ia melakukan persis apa yang Anda tuliskan dengan tangan, kecuali secara otomatis. Ini adalah cara otomatis untuk melakukan tindakan editor teks tersebut. Ini memuat file seolah-olah dimuat dengan tangan, mencarinya untuk ekspresi reguler (menggunakan sintaks ekspresi reguler yang sama yang sudah Anda gunakan di tempat lain
vim
), mencatat tempat-tempat yang cocok, dan kemudian membongkar file.sumber
Ya, alat ini disebut
grep
.Penggunaan dasar adalah:
Atau, lebih khusus:
Dalam kasus yang sangat sederhana, Anda ingin mencari semua file secara rekursif, sehingga Anda memberikan
-r
opsi. Jika Anda tidak peduli dengan huruf besar atau kecil, buatlah huruf besar-kecil dengan-i
opsi.Jika Anda hanya menginginkan bagian yang cocok, gunakan
-o
opsi.Grep dapat menggunakan ekspresi reguler , dan memiliki manual besar .
sumber
grep
adalah jawaban standar - menggunakan bendera -r untuk mencari secara rekursif atau bersamaanfind
(diskusi dan contoh dalam pertanyaan lain di situs ini, seperti yang ini )Pilihan pilihan saya belakangan ini adalah
ack
. Ini sepertinya tidak diinstal pada komputer Anda, tetapi Anda dapat menginstal menggunakan apt-get di Ubuntu atau hanya mengunduh. Tautan, instruksi, dan alasan yang lebih baik daripada grep tersedia di http://betterthangrep.com/sumber
find
dangrep
find myproject -name '*.c' -exec grep 'toUpperCase(' {} \; -print
kenapa tidak saja
grep
?grep -r string .
akan berulang melalui semua file di direktori saat ini. Jika Anda memiliki file objek atau binari lain, Anda mungkin mendapatkan kecocokan dengan hasil biner alias. sampah Jika Anda juga memiliki file fifos atau perangkat di subdirektori, Anda mungkin memiliki konsekuensi yang tidak diketahui / tidak diinginkan.grep string *.c
hanya mencari.c
file direktori saat ini .grep string **/*.c
tidak mencari semua subdirektori. Namun, jika Anda memiliki jumlah.c
file yang sangat besar, Anda berisiko melebihi jumlah maksimum ekspansi untuk shell glob. Perluasan juga harus terjadi terlebih dahulu yang berarti melintasi pohon penuh sebelumgrep
dimulai.sumber
Grep akan melakukan triknya, tetapi sedikit skrip tambahan akan membantu menemukan nama file dan baris yang dirujuk. Jika itu yang Anda inginkan, saya menemukan yang berikut ini berfungsi dengan baik. Saya menyimpannya sebagai skrip shell dan memberikannya nilai yang saya inginkan sebagai opsi baris perintah pertama.
sumber
Saya merasa menarik bahwa tidak ada yang menjawab pertanyaan spesifik Anda: "bagaimana saya menemukan apakah string tertentu ada di dalam file yang terletak di direktori saat ini". Sejauh yang saya tahu tidak ada opsi grep yang hanya mengembalikan apakah kecocokan telah ditemukan dalam sekelompok file. Opsi terdekat adalah -l untuk mencantumkan nama file. Jawaban terdekat di antara mereka sejauh ini adalah dari tim, dengan sedikit perubahan:
Anda bisa menjadikan skrip shell ini lebih umum dengan menerima argumen kedua untuk ekstensi file tanpa terlalu banyak kesulitan.
doug
sumber