Grep araması sonucunun yeni bir vi dosyasına aktarılması


63

Ben grep -e Peugeot -e PeuGeot carlist.txtcarlist.txt aramak ve bazı öğeleri çıkarmak için kullanıyorum ve grep -e Peugeot -e PeuGeot carlist.txt | vibunun benim için boru olacağını düşünmüştüm ama bu benim elde ettiğim şey:

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

Eğer bir dosyaya dahil etmek istiyorsanız, o zaman ilk kullanımı dosyada vi ve olur: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...dosyada cmd ... 'in çıktısını içerecektir (imlecin bulunduğu yerde)
Olivier Dulac

Bir "vi dosyası" ile ne demek istediğinizi açık değil. Çıktının bir dosyaya girmesini istiyorsanız, kullanın grep ... > /tmp/foo. Bu && vi /tmp/foodosyayı hemen düzenlemek istiyorsanız, sonuna ekleyebilirsiniz .
30'da LarsH

1
Aslında "vi dosyası" diye bir şey yoktur. vikeyfi metin dosyaları üzerinde çalışır; dosyaların kendileri doğrudan ilişkili değildir vi. (Ya da az önce öğrendim, içeriğinin üzerinde çalışmamıza vi -neden olur ; bunu yapar, ancak tüm sürümlerini yapmaz.)vistdinvimvi
Keith Thompson

Yanıtlar:


111

Vi veya vim'i '-' ile bir argüman olarak çalıştırmak, standart girdiden düzenlemek için dosyayı okutmasını sağlar. Dolayısıyla:

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

ihtiyacın olanı yapacağım.


3
Bunu gören herkes için, dikkat: ondan bekliyor stdin. Bazı durumlarda yönlendirme gerekecek stderriçin stdin, örneğin:valgrind my_file.out 2>&1 | vi -
Ciro Costa

Bu, arama vurgularını kaldırır
MD. Mohiuddin Ahmed

3
@ MD.MohiuddinAhmed, greparama rengini (yazdırılamayan karakterlerden oluşan) Vim'in içinde nasıl bekletmeyi umuyorsun ? Her zaman sadece bir arama yapabilirsiniz yılında Vim.
Joker

Vim içindeki vim.org/scripts/script.php?script_id=302 eklentisiyle gidebileceğimizi düşündüm .
MD. Mohiuddin Ahmed

11

Çıktı yönlendirme kullanmalısınız :

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

Ayrıca, bence grepgeliştirilebilir:

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


5

Çıktı yönlendirme ayrıca şu şekilde de kullanılabilir:

vi <(grep ...)

Birden fazla komut çıktısı bile ayrı dosyalara kaydedilmiş gibi yönlendirilebilir:

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

1

İçinde ~/bin/r:

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

içinde ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Sonra:

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

ve bende var

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

benim ~/.bashrc,içimde

r- ls -l

0

İstediğinizi, vi (m) içinde veya vi (m) dışında yapmanın birçok etkili yolu vardır.

Komutunuzu çalıştırın, (geçici) bir dosya oluşturun, ardından dosyayı düzenleyin ( bkz. Joseph R.'nin cevabı ).

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

Geçici bir dosya oluşturmak için komutunuzu (arka planda) çalıştırın ve ": e!" Kullanarak dosyayı düzenleyin. dosyanızı oluşturuldukça yenilemek için (bu, günlük dosyaları ve başka bir işlem tarafından üretilen diğer dosyalar, örneğin cron?),

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

Vi (m) komutunu çalıştırın ve geçici dosyayı oluşturmak için bir alt işlem çalıştırın ve ardından onu okuyun,

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

Veya sadece dosyaya geçin,

:e /tmp/peugeot.txt

Vi (m) çalıştırın ve double-bang "!!" vi alt komutu çalıştırmak, sonuçları almak ve geçerli konuma eklemek (geçerli satırın üzerine yazmak, bu nedenle boş bir satır olduğundan emin olun),

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

Ve şimdi (isterseniz) dosyayı herhangi bir dosya adına yazabilirsiniz,

:w /tmp/someotherfilename.txt

Ve Petr Uzel'in cevabı da iyidir.

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

Hangi stdin okur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.