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?


5
Anda agak dekat, cukup kirim vimuntuk membaca dari STDIN:grep foo | vim -
devnull

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

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.


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


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

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 -


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


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}'`
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.