Saya sering grep banyak file untuk menemukan garis, dan kemudian grep mengembalikan satu hasil. Daripada menyalin dan menempelkan nama file ke perintah baru, saya ingin dapat membuka hasil itu dengan editor. Sesuatu seperti: grep foo | vim
. Apakah ada cara untuk melakukan itu di BASH?
17
vim
untuk membaca dariSTDIN
:grep foo | vim -
Jawaban:
Gunakan
grep -l
untuk hanya mendapatkan nama file dari file yang cocok dan bukan teks yang cocok, kemudian gabungkan denganvim
:sumber
-q
flaggrep
untuk memastikan grep memang menghasilkan beberapa file yang cocok:grep -q patterns fnames && vim $(grep -l pattern fnames)
vi
mengeluh, OP mungkin tidak.Anda dapat menggunakan
quickfix
atauerrorfile
fitur dalamvim
:Vim akan membuka file pertama
/tmp/foo.list
dan menempatkan kursor langsung di baris tempatfoo
ditemukan. Anda bisa pergi ke instance berikutnya menggunakan:cn
dan instance sebelumnya menggunakan:cp
.Catatan : Jika Anda sudah menggunakan
vim
ataugvim
, maka saya akan menyarankan menggunakangrep
fungsi inbuilt-nya . Baca:help vimgrep
untuk informasi lebih lanjut.sumber
Untuk pencarian dalam proyek tidak perlu meninggalkan vim dengan Fugitive
autocmd QuickFixCmdPost *grep* cwindow
Di bawah ini Anda dapat melihat contoh
:Ggrep config
sumber
EDIT: Setelah membaca komentar Anda, saya menyadari saya awalnya tidak mengerti pertanyaan itu. Berikut ini adalah skrip sederhana yang menggunakan istilah pencarian Anda sebagai argumen dan meminta jalur untuk mencari. Jika hasilnya ditemukan hanya dalam satu file, itu membuka file untuk diedit di lokasi hasil pencarian.
sumber
@devnull mendapatkan jawaban yang benar dalam komentar ini:
sumber
Untuk memperluas jawaban Anthon untuk kasus di mana Anda memiliki lebih dari satu kecocokan, mungkin bermanfaat dalam beberapa kasus untuk menggunakan
head -1
(dari jawaban ini ) untuk memilih hanya hasil pertama:vim "$(grep -l STRING FILES|head -1)"
sumber
Jika Anda melakukan perintah panjang yang memiliki grep di suatu tempat di tengahnya, Anda juga dapat melakukannya
sumber