मैं एक फ़ाइल कैसे खोल सकता हूं जो grep से उत्पन्न होती है?


17

मैं अक्सर लाइन खोजने के लिए फाइलों का एक गुच्छा तैयार करता हूं, और फिर एक परिणाम के लिए grep रिटर्न करता है। एक नए आदेश में फ़ाइल नाम को कॉपी और पेस्ट करने के बजाय, मैं एक संपादक के साथ उस परिणाम को खोलने में सक्षम होना चाहता हूं। की तरह कुछ: grep foo | vim। क्या बाश में ऐसा करने का कोई तरीका है?


5
आप बल्कि करीब थे, बस vimसे पढ़ने के लिए कहते हैं STDIN:grep foo | vim -
devnull

जवाबों:


20

grep -lकेवल मिलान फ़ाइल का फ़ाइल नाम प्राप्त करने के लिए उपयोग करें और मिलान पाठ नहीं, तो इसे इसके साथ संयोजित करें vim:

vim "$(grep -l some_pattern file_names)"

इसके अतिरिक्त, आप यह सुनिश्चित करने -qके grepलिए ध्वज का उपयोग कर सकते हैं कि grep वास्तव में कुछ मेल खाने वाली फ़ाइल के परिणामस्वरूप है:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc

क्या मुझे रिक्त स्थान वाले फ़ाइलनाम के बारे में टिप्पणी करनी चाहिए?
बर्नहार्ड

@ बर्नहार्ड यह कभी चोट नहीं पहुंचा सकता है, और उन लोगों के बारे में भी है जो नई कहानियों और अन्य विशेष पात्रों के साथ हैं। जब मैंvi शिकायत करता हूं तो समस्या को पहचानता हूं , ओपी शायद नहीं।
एंथन

मिलान की गई फ़ाइलों के पथ में रिक्त स्थान होने पर काम नहीं करता है
psuzzi

5

आप में उपयोग quickfixया errorfileसुविधा कर सकते हैं vim:

$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list

विम पहली फ़ाइल को खोल देगा /tmp/foo.listऔर कर्सर को उस लाइन में सीधे रख देगा जहां fooपाया गया था। आप अगले उदाहरण का उपयोग करके :cnऔर पिछले उदाहरण का उपयोग करके जा सकते हैं :cp

साइड नोट : यदि आप पहले से ही उपयोग कर रहे हैं vimया gvim, तो मैं इसकी इनबिल्ट grepकार्यक्षमता का उपयोग करने का सुझाव दूंगा । :help vimgrepअधिक जानकारी के लिए पढ़ें ।


1

परियोजना में खोज के लिए भगोड़े के साथ विम को छोड़ने की आवश्यकता नहीं है

autocmd QuickFixCmdPost *grep* cwindow

नीचे आप उदाहरण देख सकते हैं :Ggrep config

यहाँ छवि विवरण दर्ज करें


0

संपादित करें: आपकी टिप्पणी को पढ़ने के बाद, मुझे एहसास हुआ कि मुझे शुरू में सवाल समझ में नहीं आया था। यहां एक सरल स्क्रिप्ट है जो आपके खोज शब्द को एक तर्क के रूप में लेती है और खोज के लिए मार्ग का संकेत देती है। यदि परिणाम केवल एक फ़ाइल में पाया जाता है, तो यह खोज परिणाम के स्थान पर संपादन के लिए फ़ाइल खोलता है।

#!/bin/bash

SRCHTRM="$1"

read -p "Where to search: " SRCHPATH

FILEFOUND=$(grep "$SRCHTRM" $SRCHPATH)
FILEFOUNDCNT=$(grep "$SRCHTRM" $SRCHPATH | wc -l)

FILEAWK=$(echo "$FILEFOUND" | awk -F":" '{ print $1 }')

if [ "$FILEFOUNDCNT" -eq "1" ];then
    vi +/"$SRCHTRM" "$FILEAWK"
else
    echo "$1 was found in more than one file"
fi

लेकिन यह मुझे grep के आउटपुट को संपादित करने की अनुमति देता है, लेकिन मैं जो करना चाहता हूं वह फ़ाइल नाम को उस grep रिटर्न के साथ संपादित करना है।
जोनाथन

0

@ देवनबुल को इस टिप्पणी में उत्तर मिला:

आप बल्कि करीब थे, बस स्टैमिन से पढ़ने के लिए विम को बताएं:

grep foo | vim -


0

एंथन के जवाब का विस्तार करने के लिए उस मामले के लिए जहां आपके पास एक से अधिक मैच हैं, केवल कुछ परिणाम का उपयोग करने के लिए कुछ मामलों में मदद मिल सकती है head -1( इस उत्तर से ) केवल पहले परिणाम का चयन करने के लिए:vim "$(grep -l STRING FILES|head -1)"


0

यदि आप एक लंबी कमांड का प्रदर्शन कर रहे हैं, जिसमें कहीं न कहीं यह बीच में है, तो आप यह भी कर सकते हैं

vim `command1 | grep whatever | awk '{do_something_else}'`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.