2009-11-11 9 views
44

मैं करने के लिए बड़े पैमाने पर संपादित फ़ाइलों है कि एक ग्रेप में लौटा दिया जाता है की एक टन चाहते हैं। (मुझे पता है, मुझे sed में बेहतर होना चाहिए)।क्या आप एक grep में लौटाई गई सभी फाइलों को बड़े पैमाने पर संपादित कर सकते हैं?

तो अगर मैं करता हूँ:

grep -rnI 'xg_icon-*' 

मैं कैसे करूँ पाइप vi में उन फ़ाइलों के सभी?

+0

लेकिन एक ही बार में केवल एक फ़ाइल खुला vi नहीं करता है? –

+0

नहीं। आप एक साथ कई फाइलें खोल सकते हैं। आदेश: अगला और: तर्क सूची के माध्यम से चक्र होगा। वास्तविक vi के साथ, आपको फ़ाइलों को बदलने से पहले सहेजना होगा। विम के साथ, आप पहले सहेजने के बिना बफर बदलने के लिए "छुपाएं सेट" कर सकते हैं, लेकिन अगर आप सहेजे गए परिवर्तनों से बाहर निकलने का प्रयास करते हैं तो भी आपको चेतावनी दी जा सकती है। इसके अलावा, विम में है: bnext और: bprev कमांड बफर सूची के माध्यम से जाने के लिए, जो तर्क सूची का एक सुपरसेट है। – jamessan

+0

उल्लेख करने के लिए एक और बात यह है कि यदि आप विम के साथ बड़ी संख्या में फाइलों को संपादित कर रहे हैं, तो आप BufExplorer vim प्लगइन की तरह कुछ उपयोग कर सकते हैं ताकि आप यह देख सकें कि आप कौन से बफर खोल चुके हैं और जल्दी से उनके बीच झटका लगाते हैं। – Benj

उत्तर

65

सबसे आसान तरीका यह है कि grep को केवल फ़ाइल नाम (-l-n के बजाय) पैटर्न से मेल खाता है। इसे एक सबहेल में चलाएं और परिणाम को विम पर फ़ीड करें।

vim $(grep -rIl 'xg_icon-*' *) 
+1

यह भी ध्यान रखें कि जब मानक इनपुट पाइप से होता है तो विम इसे पसंद नहीं करता है, इसलिए उपरोक्त 'grep -rIl ... से बेहतर है। vim '। –

+0

विम मानक इनपुट के साथ खुश है जब आप इसे 'vim -' –

+0

' के साथ आमंत्रित करते हैं @ Kaleb vim एक पाइप से आता है तो बहुत अच्छी तरह से काम करता है। बस उस मामले में xargs को कॉल न भूलें। जब पाइप सामग्री के साथ विम भरता है और फ़ाइल नाम नहीं देता है, तो भुगतान किए गए नेर्ड ने आपकी टिप्पणी का उत्तर दिया: डैश को मत भूलना। –

21

यह करने के लिए एक अच्छा सामान्य समाधान xargs उपयोग करने के लिए एक तर्क सूची में ग्रेप की तरह एक प्रक्रिया से एक stdout कन्वर्ट करने के लिए है।

अ ला:

grep -rIl 'xg_icon-*' | xargs vi 
+0

मेरे लिए बहुत उपयोगी उत्तर, कम से कम नहीं, क्योंकि यह उन कार्यक्रमों को सामान्यीकृत करता है जो 'vi' नहीं हैं। (हम में से कुछ उस जनजाति के नहीं हैं, लेकिन इस किस्म के अधिकांश प्रश्न इस तरह से स्पष्ट रूप से स्पष्ट रूप से इंगित करते हैं।) –

+1

मेरे मैक (टर्मिनल में) पर, विम के साथ इसे निष्पादित करने के बाद, मेरे टर्मिनल में stdin के साथ कुछ फंकी समस्याएं थीं। अन्य समाधानों के साथ मामला नहीं है। पात्रों को स्पष्ट रूप से नहीं दिखाया गया था, आदि विचार? –

1

यदि क्या आप संपादित करना चाहते सभी फ़ाइलों को भर में इसी तरह की है, तो vi का उपयोग कर कोई मतलब नहीं मैन्युअल रूप से ऐसा करने के लिए। (हालांकि vi के साथ-साथ पटकथा जा सकता है), परिकल्पित है, यह इस तरह दिखता है, जब से तुम कभी नहीं क्या आप

grep -rnI 'xg_icon-*' | while read FILE 
do 
    sed -i.bak 's/old/new/g' $FILE # (or other editing commands, eg awk...) 
done 
6

संपादित करने के लिए यदि आप vim और -p विकल्प का उपयोग करना चाहता हूँ का उल्लेख है, उस में प्रत्येक फ़ाइल खुल जाएगा एक टैब, और यदि आप टर्मिनल

+0

बहुत बहुत धन्यवाद! यह सुविधा कमाल है! – ep3static

6

में माउस समर्थन करते हैं तो आप gt या gt, या यहां तक ​​कि माउस का उपयोग करके उनके बीच स्विच कर सकते हैं, आप grep आउटपुट के किसी भी प्रोसेसिंग के बिना इसे कर सकते हैं! यह भी सही लाइन (, :help quickfix आदेशों का उपयोग करते जैसे। :cn या :cw) जाने के लिए कर सकेंगे। इसलिए, यदि आप बैश या zsh उपयोग कर रहे हैं:

 
vim -q <(grep foo *.c) 
+1

vim -q -c Copen <(ग्रेप foo * ग) और भी बेहतर हो रहा है – lkraav

संबंधित मुद्दे