एक नए vi फ़ाइल में grep खोज के परिणाम को कैसे पाइप करें


63

मैं grep -e Peugeot -e PeuGeot carlist.txtcarlist.txt के माध्यम से खोज करने के लिए उपयोग कर रहा हूं और कुछ आइटम बाहर निकालता हूं और मैंने अनुमान लगाया है कि grep -e Peugeot -e PeuGeot carlist.txt | viयह मेरे लिए पाइप करेगा, लेकिन यह वही है जो मैं कर रहा हूं:

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

यदि आप इसे किसी फ़ाइल में शामिल करना चाहते हैं, तो मैं पहले फ़ाइल पर vi का उपयोग करूँगा, और फिर :read !grep -e Peugeot -e PeuGeot carlist.txt:। :read !cmd...cmd का आउटपुट शामिल करेगा ... फ़ाइल में (कर्सर के स्थान पर)
ओलिवियर दुलैक

यह स्पष्ट नहीं है कि आप "vi फ़ाइल" से क्या मतलब है। यदि आप चाहते हैं कि आउटपुट फ़ाइल में जाए, तो उपयोग करें grep ... > /tmp/foo&& vi /tmp/fooयदि आप उस फ़ाइल को तुरंत संपादित करना चाहते हैं, तो आप अंत में जोड़ सकते हैं ।
लार्स

1
वास्तव में "vi फाइल" जैसी कोई चीज नहीं है। viमनमानी पाठ फ़ाइलों पर काम करता है; फाइलें खुद से सीधे जुड़ी नहीं हैं vi। (या, जैसा कि मैंने अभी सीखा है, इस की सामग्री पर काम करने vi -का कारण होगा ; यह ऐसा करता है, लेकिन इसके सभी संस्करण नहीं हैं।)vistdinvimvi
कीथ थॉम्पसन

जवाबों:


111

एक तर्क के रूप में '-' के साथ चल रहे vi या vim यह मानक इनपुट से संपादित करने के लिए फ़ाइल को पढ़ता है। अत:

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

आप की जरूरत है क्या करेंगे


3
किसी को भी यह देखने के लिए, ध्यान: यह उम्मीद करता है stdin। कुछ मामलों में आपको निम्न से stderrstdinvalgrind my_file.out 2>&1 | vi -
अप्रत्यक्ष

यह खोज हाइलाइटिंग को हटाता है
एमडी। मोहिउद्दीन अहमद

3
@ MD.MohiuddinAhmed, आप grepविम के अंदर खोज रंग (गैर-वर्ण वर्णों से बना) रखने की अपेक्षा कैसे करते हैं ? आप हमेशा विम में एक खोज कर सकते हैं ।
वाइल्डकार्ड

मुझे लगा कि हम vim.org/scripts/script.php?script_id=302 प्लगइन के भीतर जा सकते हैं ।
एमडी।


11

इसके अलावा vim -, आप <(command)सिंटैक्स का उपयोग करके प्रक्रिया प्रतिस्थापन का उपयोग भी कर सकते हैं , उदाहरण के लिए:

vim <(echo This is example.)
vim <(cat /etc/hosts)

यह सभी देखें:


5

आउटपुट पुनर्निर्देशन का उपयोग इस तरह भी किया जा सकता है:

vi <(grep ...)

यहां तक ​​कि कई कमांड आउटपुट को पुनर्निर्देशित किया जा सकता है, जैसे कि वे अलग-अलग फ़ाइलों में सहेजे गए थे:

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

1

इन ~/bin/r:

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

में ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

फिर:

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

और मुझे मिल गया है

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

मेरे ~/.bashrc,इतने में

r- ls -l

0

वीए (एम) या वी (एम) के बाहर, आप जो चाहते हैं, उसे करने के कई प्रभावी तरीके हैं।

अपना आदेश चलाएँ, एक अस्थायी (अस्थायी) फ़ाइल का उत्पादन करें, फिर फ़ाइल को संपादित करें ( जोसेफ आर का उत्तर देखें )

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

एक अस्थायी फ़ाइल का उत्पादन करने के लिए अपना कमांड (पृष्ठभूमि में) चलाएं और ": e!" का उपयोग करके फ़ाइल को संपादित करें। अपनी फ़ाइल को ताज़ा करने के लिए जैसा कि यह उत्पादन किया जाता है (यह लॉगफ़ाइल्स के लिए उपयोगी है, और अन्य फ़ाइलों को किसी अन्य प्रक्रिया द्वारा निर्मित किया जा रहा है, जैसे क्रॉन,?)

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

Vi (m) चलाएँ, और अस्थायी फ़ाइल बनाने के लिए एक चाइल्ड प्रोसेस चलाएँ, और फिर इसे पढ़ें,

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

या, बस फ़ाइल पर स्विच करें,

:e /tmp/peugeot.txt

भागो vi (एम), और डबल बैंग का उपयोग करें "!!" vi, चाइल्ड कमांड चलाने के लिए, परिणाम ले रहे हैं और उन्हें वर्तमान स्थान में सम्मिलित कर रहे हैं (वर्तमान लाइन को ओवरराइट करता है, इसलिए सुनिश्चित करें कि आपके पास एक रिक्त रेखा है),

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

और अब आप फ़ाइल को लिख सकते हैं (यदि आप चाहते हैं) किसी फ़ाइल नाम के लिए,

:w /tmp/someotherfilename.txt

और पेट्र उज़ेल का जवाब भी अच्छा है,

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

जो स्टडिन से पढ़ता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.