2010-04-22 11 views
9

तारों के लिए कोड खोजते समय, मैं लगातार समस्या में भाग लेता हूं कि मुझे अर्थहीन, संदर्भ-कम परिणाम मिलते हैं। उदाहरण के लिए, यदि फ़ंक्शन कॉल को 3 लाइनों में विभाजित किया गया है, और मैं पैरामीटर के नाम की खोज करता हूं, तो मुझे एक लाइन पर पैरामीटर मिलता है, न कि फ़ंक्शन का नाम।मैं पूरी तरह से संभवतः लिपटे, कोड की रेखाओं के लिए कैसे grep कर सकता हूँ?

उदाहरण के लिए

, एक फ़ाइल MY_CONSTANT के लिए grepping एक पंक्ति है कि इस तरह देखा वापसी होगी

... 
    someFunctionCall ("test", 
        MY_CONSTANT, 
        (some *really) - long/expression); 

युक्त:

    MY_CONSTANT, 

इसी तरह एक टिप्पणी ब्लॉक में:

///////////////////////////////////////// 
// FIXMESOON, do..while is the wrong choice here, because 
// it makes the wrong thing happen 
///////////////////////////////////////// 

फिक्समेसन के लिए ग्रेपिंग बहुत निराशाजनक उत्तर देता है:

// FIXMESOON, do..while is the wrong choice here, because 

जब हजारों हिट होते हैं, तो सिंगल लाइन परिणाम थोड़ा अर्थहीन होते हैं। मैं क्या करना चाहता हूं कि grep को स्रोत कोड लाइनों के प्रारंभ और रोक बिंदुओं के बारे में पता होना चाहिए, जैसा कि इसे सरल मानते हैं ";" क्योंकि लाइन विभाजक एक अच्छी शुरुआत होगी।

बोनस अंक यदि आप टिप्पणी के अंदर है तो आप इसे संपूर्ण टिप्पणी ब्लॉक वापस कर सकते हैं।

मुझे पता है कि आप अकेले grep के साथ ऐसा नहीं कर सकते हैं। मैं grep को संदर्भ की पंक्तियों की एक निश्चित संख्या वापस करने के विकल्प के बारे में भी जानता हूं। लिनक्स के तहत कैसे पूरा किया जाए इस पर कोई सुझाव? एफवाईआई मेरी पसंदीदा भाषा सी और पर्ल हैं।

मुझे यकीन है कि मैं कुछ लिख सकता हूं, लेकिन मुझे पता है कि किसी ने पहले से ही यह किया होगा।

धन्यवाद!

+3

पता नहीं सब गाजर को बदलने के लिए है, लेकिन यह एक अच्छा सवाल है! – mpen

+1

एक अच्छे समाधान के बदले, आप संदर्भ –

उत्तर

3

आप -एम विकल्प के साथ pcregrep का उपयोग कर सकते हैं (multiline मिलान; pcregrep पर्ल-संगत नियमित अभिव्यक्तियों के साथ grep है)। की तरह कुछ:

pcregrep -M ";*\R*.*thingtosearchfor*\R*.*;.*" 
+0

कूल की 'एन' लाइनों के लिए हमेशा grep के '-C n' का उपयोग कर सकते हैं, किसी भी तरह से pcregrep के बारे में कभी नहीं पता था। उपयोग संकेत से प्यार करें: 'उपयोग: pcregrep [-ABCcDdeFfHhilLMNnoqrsuVvwx] [लंबे विकल्प] [पैटर्न] [फ़ाइलें] '। यह जानने के लिए हमेशा अच्छे हैं कि कौन से पात्र वैध विकल्प हैं! – Cascabel

+0

... * हाँ *, विकल्प bloat, क्या मजेदार है। –

+0

@ वाश - क्या विकल्प bloat ??? वे अभी भी 20 अक्षरों को अनचाहे छोड़ दिया है! – DVK

1

आप grep का उपयोग करके विकल्प संख्या के साथ एक कमांड लाइन लिख सकते हैं जो आपको लाइन नंबर और फ़ाइल नाम देता है, फिर इन परिणामों को इन कॉलम को पार्स करने के लिए अजीब में घुमाएं और उसके बाद एन लाइनों को प्रदर्शित करने के लिए आप से एक छोटी स्क्रिप्ट का उपयोग करें लाइन? :)

1

तुम सिर्फ cscope (सी कोड के लिए ही है, हालांकि) इस्तेमाल कर सकते हैं तो यह एक शैक्षणिक प्रयास नहीं है। यदि आप टिप्पणियों में खोजने के लिए आवश्यकता को छोड़ने के इच्छुक हैं ctags पर्याप्त होना चाहिए (और यह पर्ल का भी समर्थन करता है)।

3

यहां awk का उपयोग करके एक उदाहरण दिया गया है।

$ cat file 
blah1 
blah2 
    function1 ("test", 
        MY_CONSTANT, 
        (some *really) - long/expression); 

function2(one , two) 
blah3 
blah4 

$ awk -vRS=")" '/function1/{gsub(".*function1","function1");print $0RT}' file 
function1 ("test", 
        MY_CONSTANT, 
        (some *really) 

पीछे की अवधारणा: आरएस रिकॉर्ड विभाजक है। इसे ")" पर सेट करके, फिर आपकी फ़ाइल में प्रत्येक रिकॉर्ड को नई लाइन के बजाय ")" से अलग किया जाता है। यह आपके "function1" को ढूंढना आसान बनाता है क्योंकि आप इसके लिए "grep" कर सकते हैं। यदि आप अजीब का उपयोग नहीं करते हैं, तो उसी अवधारणा को "विभाजन" पर "विभाजन" का उपयोग करके लागू किया जा सकता है।

0

मेरी एक ऐसी स्थिति थी जिसमें मेरे पास एक एक्सएमएल शैली प्रारूप में ज़िप फ़ाइलों के नाम से भरा एक एक्सएमएल फ़ाइल था, यानी, फाइलों के नामों को ब्रैकेट करने वाले गाजर के साथ, उदाहरण के लिए।ज़िप < \ सामान>

मैं awk इस्तेमाल किया नई-पंक्तियों में तो इस्तेमाल किया ग्रेप :)

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