टिप्पणियों को पकड़ने के बिना स्रोत कोड पर grep कैसे करें


10

मैं टिप्पणियों के कारण कभी-कभी झूठे-सकारात्मक होने के बिना स्रोत कोड पर grep करने का एक तरीका खोजता हूं। उदाहरण के लिए यदि मैं इस .c स्रोत कोड पर foo खोजता हूं:

/* 
 * foo has changed [...] and is now a 2-parameters function
 */
// foo(24)
foo(42, 28);

एक भोली grepको 3 घटनाएं मिलेंगी, जहां मुझे केवल एक ही चाहिए। मैंने इसे StackOverflow पर करने का तरीका देखा है , लेकिन यह मेरी जरूरतों को पूरा नहीं करता है: PHP प्लेटफॉर्म पर उपलब्ध नहीं है। मैंने इस तरह से एक-पंक्ति टिप्पणियों के लिए भी पाया है , लेकिन यह केवल मेरी समस्या का एक हिस्सा हल करता है।

मैं शास्त्रीय पटकथा उपकरण (awk, SED, बैश, ग्रेप, आदि) का उपयोग करने की जरूरत है और मैं इसे होने की जरूरत तेजी से भले ही फाइलों के हजारों रहे हैं।

क्या अब आप स्रोत कोड और केवल स्रोत कोड को पकड़ना संभव है, तो कैसे करें?


3
एक बिल्डिंग टैग तालिका , एक बेहतर दृष्टिकोण हो सकता है आप क्या कर रहे हैं पर निर्भर करता।
गिल्स एसओ-

जवाबों:


10

आप इस तरह गैर-टिप्पणियों से मेल करने के लिए एक भोली दृष्टिकोण की कोशिश कर सकते हैं:

 $ egrep -v "^(//|/\*| \*)" sourcecode

पहले से जुड़ा हुआ टिप्पणियों के खिलाफ यह केवल उलटा मैच - यह है कि के साथ शुरू लाइनों या तो //, /*, *या */- और इसलिए यह ब्लॉक कि के साथ बाहर टिप्पणी की बाहर नहीं छोड़ देंगे /*और */जोड़ी।


प्रेरित टिप्पणियों के लिए काम करने के लिए थोड़ा संशोधित: $ egrep -v "^ [[: space:]] * ((// (/ | / * * *)" sourcecode
mbonness

11

grep शुद्ध पाठ पर काम करता है और आपके C प्रोग्राम के अंतर्निहित सिंटैक्स के बारे में कुछ भी नहीं जानता है। इसलिए, टिप्पणियों के अंदर खोज न करने के लिए आपके पास कई विकल्प हैं:

  1. खोज से पहले स्ट्रिप सी-कमेंट्स करें, आप इसका उपयोग gcc -fpreprocessed -dD -E yourfile.cविवरणों के लिए कर सकते हैं , कृपया /programming/2394017/remove-comments-from-cc-code देखें

  2. कुछ हैक की गई आधी-अधूरी स्क्रिप्टों का उपयोग करें / लिखें जैसे कि आप पहले ही पा चुके हैं (जैसे कि वे सभी संभव सी / सी ++ टिप्पणियों के विवरण को संभालने के लिए लाइनों को शुरू करने के लिए //या उसके साथ काम करते हैं /*) (फिर से, कुछ डरावने टेस्टकेस के लिए पिछला लिंक देखें) । फिर आपके पास अभी भी झूठी सकारात्मकता हो सकती है, लेकिन आपको किसी भी चीज को रोकना नहीं है।

  3. कोड में "सिमेंटिक खोज" करने के लिए अधिक उन्नत उपकरणों का उपयोग करें। मैंने "coccigrep" पाया है: http://home.regit.org/software/coccigrep/ इस प्रकार के उपकरण कुछ विशिष्ट भाषा कथनों की खोज करने की अनुमति देते हैं (अर्थात दिए गए नाम के साथ एक संरचना का अद्यतन) और निश्चित रूप से वे टिप्पणियों को छोड़ देते हैं।


1

यहाँ हम सभी के लिए एक विशिष्ट भिन्नता है इस प्रश्न के लिए देर से आने वाले बाकी सभी:

ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s

एक सूची अगर सी स्रोत फ़ाइलें

ls -1 src/*.c

xargs के लिए पाइप किया जाता है, जो एक बच्चे के खोल में प्रीप्रोसेसर को निष्पादित करता है

gcc -fpreprocessed -dD -E {} 2>&1

जिसे बाद में वांछित grep कमांड में पाइप किया जाता है

grep -wi -e one -e two -e three -n

जो तब वर्तमान फ़ाइल नाम के साथ प्रत्येक पंक्ति को उपसर्ग करने के लिए sed में पाइप किया जाता है

sed 's:^:{}\::'

अंत में, सभी बार-बार खाली लाइनों को बिल्ली का उपयोग करके एकल लाइनों तक ढह दिया जाता है:

cat -s

यह एक आरएचईएल 6 सिस्टम पर काम करता है, लेकिन मुझे लगता है कि यह अन्य * निक्स सिस्टम के लिए पर्याप्त सामान्य है।

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