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.
Lmedza
sumber
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.

Petr Uzel
sumber
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
Joseph R.
sumber
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)
musa
sumber
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
jthill
sumber
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

ChuckCottrill
sumber