Cách chuyển kết quả tìm kiếm grep vào tệp vi mới


63

Tôi đang sử dụng grep -e Peugeot -e PeuGeot carlist.txtđể tìm kiếm thông qua carlist.txt và lấy ra một số mặt hàng và tôi cho rằng grep -e Peugeot -e PeuGeot carlist.txt | visẽ chuyển nó qua cho tôi nhưng đây là những gì tôi nhận được:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

nếu bạn muốn đưa nó vào một tệp, trước tiên tôi nên sử dụng vi trên tệp đó và sau đó : :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...sẽ bao gồm đầu ra của cmd ... trong tệp (tại vị trí của con trỏ)
Olivier Dulac

Không rõ ý của bạn là "tập tin vi". Nếu bạn muốn đầu ra đi vào một tập tin, sử dụng grep ... > /tmp/foo. Bạn có thể thêm && vi /tmp/foovào cuối nếu bạn muốn chỉnh sửa tập tin đó ngay lập tức.
LarsH

1
Trong thực tế không có thứ gọi là "tập tin vi". vihoạt động trên các tệp văn bản tùy ý; các tập tin không được liên kết trực tiếp với vi. (Hoặc, như tôi vừa học được, vi -sẽ gây ra viđể hoạt động trên các nội dung của stdin; vimthực hiện điều này, nhưng không phải tất cả các phiên bản của viviệc phải làm.)
Keith Thompson

Câu trả lời:


111

Chạy vi hoặc vim với '-' làm đối số làm cho nó đọc tệp để chỉnh sửa từ đầu vào tiêu chuẩn. Vì thế:

grep -e Peugeot -e PeuGeot carlist.txt | vi -

sẽ làm những gì bạn cần.


3
Đối với bất cứ ai nhìn thấy điều này, sự chú ý: nó mong đợi từ stdin. Trong một số trường hợp, bạn sẽ phải chuyển hướng từ stderrđến stdin, ví dụ:valgrind my_file.out 2>&1 | vi -
Ciro Costa

Điều này loại bỏ các điểm nổi bật tìm kiếm
MD. Mohiuddin Ahmed

3
@ MD.MohiuddinAhmed, làm thế nào bạn mong đợi giữ grepmàu tìm kiếm (bao gồm các ký tự không thể in được) bên trong Vim? Bạn luôn có thể thực hiện tìm kiếm trong Vim.
tự đại diện

Tôi nghĩ rằng chúng ta có thể đi với plugin vim.org/scripts/script.php?script_id=302 trong vim.
MD. Mohiuddin Ahmed

11

Bạn nên sử dụng chuyển hướng đầu ra :

grep ... > newfile.txt && vi newfile.txt

Ngoài ra, tôi nghĩ rằng bạn grepcó thể được cải thiện:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt


5

Chuyển hướng đầu ra cũng có thể được sử dụng như thế này:

vi <(grep ...)

Thậm chí nhiều đầu ra lệnh có thể được chuyển hướng, như thể chúng được lưu trong các tệp riêng biệt:

vim -d <(ls) <(ls -a)

1

Trong ~/bin/r:

#!/bin/sh
[ $# -eq 0 ] && set -- -;
exec vi -R "$@"

trong ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Sau đó:

ls |r
grep -e Peugeot -e PeuGeot carlist.txt | r

và tôi đã có

r- () { "$@" | r; }

trong tôi ~/.bashrc,cũng vậy

r- ls -l

0

Có nhiều cách hiệu quả để làm những gì bạn muốn, trong phạm vi vi (m) hoặc bên ngoài vi (m).

Chạy lệnh của bạn, tạo tệp (tạm thời), sau đó chỉnh sửa tệp ( xem câu trả lời của Joseph R. )

grep -e"Peu[gG]eot" carlist.txt && vi /tmp/peugeot.txt

Chạy lệnh của bạn (trong nền) để tạo một tệp tạm thời và chỉnh sửa tệp, sử dụng ": e!" để làm mới tệp của bạn khi nó được tạo ra (điều này rất hữu ích cho các tệp logfile và các tệp khác đang được sản xuất bởi một quy trình khác, ví dụ: cron?),

grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt &
vi /tmp/peugeot.txt

Chạy vi (m) và chạy một tiến trình con để tạo tệp tạm thời, sau đó đọc nó,

vi
:!grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt
:r /tmp/peugeot.txt

Hoặc, chỉ cần chuyển sang tập tin,

:e /tmp/peugeot.txt

Chạy vi (m) và sử dụng cú đúp "!!" để vi chạy lệnh con, lấy kết quả và chèn chúng vào vị trí hiện tại (ghi đè lên dòng hiện tại, vì vậy hãy đảm bảo bạn có một dòng trống),

vi
i
here
empty
there
<esc>
kk
!!grep -e "Peu[gG]eot" carlist.txt

Và bây giờ bạn có thể ghi tệp (nếu bạn muốn) vào bất kỳ tên tệp nào,

:w /tmp/someotherfilename.txt

câu trả lời của Petr Uzel cũng tốt,

grep -e "Peu[gG]eot" carlist.txt | vi -

Mà đọc từ stdin

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.