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.