Làm cách nào tôi có thể mở tệp kết quả từ grep?


16

Tôi thường grep một loạt các tập tin để tìm một dòng, và sau đó grep trả về một kết quả. Thay vì sao chép và dán tên tệp vào một lệnh mới, tôi muốn có thể mở kết quả đó bằng trình chỉnh sửa. Một cái gì đó như : grep foo | vim. Có cách nào để làm điều đó trong BASH không?


5
Bạn đã khá gần gũi, chỉ cần nói vimđể đọc từ STDIN:grep foo | vim -
devnull

Câu trả lời:


20

Sử dụng grep -lđể chỉ lấy tên tệp của tệp phù hợp chứ không phải văn bản phù hợp, sau đó kết hợp nó với vim:

vim "$(grep -l some_pattern file_names)"

Ngoài ra, bạn có thể sử dụng -qcờ của grepđể đảm bảo grep thực sự đã dẫn đến một số tệp phù hợp:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc

Tôi có nên đưa ra một nhận xét về tên tập tin với không gian?
Bernhard

@Bernhard Nó không bao giờ có thể làm tổn thương, và cả về những người có dòng mới và các nhân vật đặc biệt khác. Tôi nhận ra vấn đề khi viphàn nàn, OP có thể không.
Anthon

Không hoạt động nếu các tệp trùng khớp có khoảng trắng trong đường dẫn của chúng
psuzzi

5

Bạn có thể sử dụng quickfixhoặc errorfiletính năng trong vim:

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

Vim sẽ mở tệp đầu tiên /tmp/foo.listvà đặt con trỏ trực tiếp vào dòng foođược tìm thấy. Bạn có thể đi đến trường hợp tiếp theo bằng cách sử dụng :cnvà phiên bản trước bằng cách sử dụng :cp.

Lưu ý bên lề : Nếu bạn đã sử dụng vimhoặc gvim, thì tôi sẽ đề nghị sử dụng grepchức năng sẵn có của nó . Đọc :help vimgrepđể biết thêm thông tin.


1

Để tìm kiếm trong dự án, không cần phải rời khỏi vim với Fugitive

autocmd QuickFixCmdPost *grep* cwindow

Dưới đây bạn có thể xem ví dụ về :Ggrep config

nhập mô tả hình ảnh ở đây


0

EDIT: Sau khi đọc bình luận của bạn, tôi nhận ra ban đầu tôi không hiểu câu hỏi. Đây là một tập lệnh đơn giản lấy thuật ngữ tìm kiếm của bạn làm đối số và nhắc nhở đường dẫn tìm kiếm. Nếu kết quả chỉ được tìm thấy trong một tệp, nó sẽ mở tệp để chỉnh sửa tại vị trí của kết quả tìm kiếm.

#!/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

Nhưng điều này dường như cho phép tôi chỉnh sửa đầu ra của grep, nhưng điều tôi muốn làm là chỉnh sửa tệp với tên tệp mà grep trả về.
Jonathan

0

@devnull đã có câu trả lời ngay trong bình luận này:

Bạn đã khá gần gũi, chỉ cần nói vim đọc từ STDIN:

grep foo | vim -


0

Để mở rộng câu trả lời của Anthon cho trường hợp bạn có nhiều trận đấu, trong một số trường hợp có thể hữu ích head -1(từ câu trả lời này ) để chỉ chọn kết quả đầu tiên:vim "$(grep -l STRING FILES|head -1)"


0

Nếu bạn đang thực hiện một lệnh dài có grep ở đâu đó ở giữa nó, bạn cũng có thể làm

vim `command1 | grep whatever | awk '{do_something_else}'`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.