Cara menyalurkan hasil pencarian grep ke file vi baru


63

Saya menggunakan grep -e Peugeot -e PeuGeot carlist.txtuntuk mencari melalui carlist.txt dan mengeluarkan beberapa item dan saya grep -e Peugeot -e PeuGeot carlist.txt | vikira itu akan pipa untuk saya tetapi ini adalah apa yang saya dapatkan:

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

jika Anda ingin memasukkannya dalam file, saya akan menggunakan vi pertama pada file, dan kemudian: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...akan memasukkan output cmd ... dalam file (di lokasi kursor)
— Olivier Dulac

Tidak jelas apa yang Anda maksud dengan "file vi". Jika Anda ingin output masuk ke file, gunakan grep ... > /tmp/foo. Anda dapat menambahkan && vi /tmp/foodi bagian akhir jika Anda ingin segera mengedit file itu.
— LarsH

1
Sebenarnya tidak ada yang namanya "vi file". viberoperasi pada file teks sewenang-wenang; file itu sendiri tidak terkait langsung dengan vi. (Atau, seperti yang baru saja saya pelajari, vi -akan menyebabkan viberoperasi pada isi stdin; vimapakah ini, tetapi tidak semua versi vidilakukan.)
— Keith Thompson

Jawaban:


111

Menjalankan vi atau vim dengan '-' sebagai argumen membuatnya membaca file untuk diedit dari input standar. Karenanya:

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

akan melakukan apa yang Anda butuhkan.


3
Bagi siapa pun yang melihat ini, perhatian: diharapkan dari stdin. Dalam beberapa kasus, Anda harus mengarahkan dari stderrke stdin, misalnya:valgrind my_file.out 2>&1 | vi -
— Ciro Costa

Ini menghilangkan sorotan pencarian
— MD. Mohiuddin Ahmed

3
@ MD.MohiuddinAhmed, bagaimana Anda berharap untuk menjaga greppewarnaan pencarian (terdiri dari karakter yang tidak dapat dicetak) di dalam Vim? Anda selalu dapat melakukan pencarian di Vim.
— Wildcard

Saya pikir kita bisa menggunakan plugin vim.org/scripts/script.php?script_id=302 dalam vim.
— MD. Mohiuddin Ahmed

11

Anda harus menggunakan pengalihan output :

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

Juga, saya pikir Anda grepdapat ditingkatkan:

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


5

Pengalihan output juga dapat digunakan seperti ini:

vi <(grep ...)

Bahkan beberapa output perintah dapat dialihkan, seolah-olah disimpan dalam file terpisah:

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

1

Di ~/bin/r:

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

di ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Kemudian:

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

dan saya punya

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

di saya ~/.bashrc,begitu

r- ls -l

0

Ada banyak cara efektif untuk melakukan apa yang Anda inginkan, baik di dalam vi (m) atau di luar vi (m).

Jalankan perintah Anda, buat file (sementara), lalu edit file ( lihat jawaban Joseph R. )

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

Jalankan perintah Anda (di latar belakang) untuk menghasilkan file sementara, dan edit file tersebut, menggunakan ": e!" untuk me-refresh file Anda seperti yang dihasilkan (ini berguna untuk file log, dan file lain yang diproduksi oleh proses lain, misalnya cron?),

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

Jalankan vi (m), dan jalankan proses anak untuk membuat file sementara, dan kemudian membacanya,

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

Atau, cukup pindah ke file,

:e /tmp/peugeot.txt

Jalankan vi (m), dan gunakan double-bang "!!" untuk memiliki vi menjalankan perintah anak, mengambil hasil dan memasukkannya ke lokasi saat ini (menimpa garis saat ini, jadi pastikan Anda memiliki baris kosong),

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

Dan sekarang Anda dapat menulis file (jika Anda mau) ke nama file apa saja,

:w /tmp/someotherfilename.txt

Dan jawaban Petr Uzel juga bagus,

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

Yang berbunyi dari stdin

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.