Bagaimana saya bisa membuka file yang dihasilkan dari grep?

17

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?

Jonathan
sumber
5
Anda agak dekat, cukup kirim vimuntuk membaca dari STDIN:grep foo | vim -
devnull
2
Lihat juga unix.stackexchange.com/q/110146/22565
Stéphane Chazelas

Jawaban:

20

Gunakan grep -luntuk hanya mendapatkan nama file dari file yang cocok dan bukan teks yang cocok, kemudian gabungkan dengan vim:

vim "$(grep -l some_pattern file_names)"
Anthon
sumber
Selain itu, Anda dapat menggunakan -qflag grepuntuk memastikan grep memang menghasilkan beberapa file yang cocok:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc
Haruskah saya membuat komentar tentang nama file dengan spasi?
Bernhard
@ Bernhard Tidak ada salahnya, dan juga tentang mereka yang memiliki baris baru dan karakter khusus lainnya. Saya mengenali masalah ketika vimengeluh, OP mungkin tidak.
Anthon
Tidak berfungsi jika file yang cocok memiliki spasi di jalurnya
psuzzi
5

Anda dapat menggunakan quickfixatau errorfilefitur dalam vim:

$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list

Vim akan membuka file pertama /tmp/foo.listdan menempatkan kursor langsung di baris tempat fooditemukan. Anda bisa pergi ke instance berikutnya menggunakan :cndan instance sebelumnya menggunakan :cp.

Catatan : Jika Anda sudah menggunakan vimatau gvim, maka saya akan menyarankan menggunakan grepfungsi inbuilt-nya . Baca :help vimgrepuntuk informasi lebih lanjut.

Srinidhi
sumber
1

Untuk pencarian dalam proyek tidak perlu meninggalkan vim dengan Fugitive

autocmd QuickFixCmdPost *grep* cwindow

Di bawah ini Anda dapat melihat contoh :Ggrep config

masukkan deskripsi gambar di sini

selamat tinggal
sumber
0

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.

#!/bin/bash

SRCHTRM="$1"

read -p "Where to search: " SRCHPATH

FILEFOUND=$(grep "$SRCHTRM" $SRCHPATH)
FILEFOUNDCNT=$(grep "$SRCHTRM" $SRCHPATH | wc -l)

FILEAWK=$(echo "$FILEFOUND" | awk -F":" '{ print $1 }')

if [ "$FILEFOUNDCNT" -eq "1" ];then
    vi +/"$SRCHTRM" "$FILEAWK"
else
    echo "$1 was found in more than one file"
fi
Timothy Martin
sumber
Tapi ini sepertinya memungkinkan saya untuk mengedit output grep, tetapi yang ingin saya lakukan adalah mengedit file dengan nama file yang dikembalikan grep.
Jonathan
0

@devnull mendapatkan jawaban yang benar dalam komentar ini:

Anda agak dekat, cukup beritahu vim untuk membaca dari STDIN:

grep foo | vim -

Noumenon
sumber
0

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)"

EL_DON
sumber
0

Jika Anda melakukan perintah panjang yang memiliki grep di suatu tempat di tengahnya, Anda juga dapat melakukannya

vim `command1 | grep whatever | awk '{do_something_else}'`
Greg
sumber