हेडर / टिप्पणी ब्लॉक को पुनः प्राप्त करना


1

मेरे पास कई लॉग फाइलें हैं जो इस तरह दिखती हैं:

/*
header
arbitrary number of lines
*/
blah blah
blah blah

सरल बैश कमांड (अधिमानतः sed, नहीं awk) का उपयोग करके, मैं केवल हेडर लाइन्स (आदर्श रूप से टिप्पणी मार्कर सहित) कैसे प्राप्त करूंगा?

मैंने RTFM किया है और गुग्लिंग की कोशिश की है, यह भी पाया गया कुछ संकेत , लेकिन मुझे शुरू करने के लिए पर्याप्त नहीं है।

धन्यवाद!


एक अन्य संबंधित लिंक: cyberciti.biz/faq/sed-howto-remove-lines-paragraphs हालांकि मुझे इसकी आवश्यकता के विपरीत है।
AnC

जवाबों:


2

यदि आप निम्नलिखित बातों की पुष्टि करते हैं, तो इस उत्तर की स्क्रिप्ट आपके लिए काम करेगी।

  1. फ़ाइलें "से शुरू होती हैं /* " वर्ण
    • मल्टी-लाइन सी-सिन्टेक्स कमेंट ब्लॉक हो सकता है जो नेस्टेड न हो
    • टिप्पणी खंड एक ही पंक्ति पर कोई अतिरिक्त सी-स्टेटमेंट के साथ समाप्त होता है
sed -n '/^\/\*/,/\*\// p' file.c
#        - - -    - - 

यह फ़ाइल की शुरुआत से टिप्पणी ब्लॉक के अंत तक सभी लाइनों से मेल खाएगा।
दूसरी पंक्ति (एक "के साथ" # "शुरुआत में) खोजे जा रहे मैच पर प्रकाश डाला गया।
" -n "शुरुआत में और" p "अंत में केवल मिलान वाले भाग को प्रिंट करने के लिए sed को बताएं।


@ एएनसी, मुझे लगता है कि मेरे समाधान में भी समस्या है। यह जैसे रुकता नहीं है Richard पहले मैच के बाद की कमान! इसलिए, आपको एक फ़ाइल में नई लाइनें (आवश्यकता 1 फ़ाइल के प्रारंभ तक सीमित नहीं है) पर सभी टिप्पणियां मिलेंगी।
nik

बस एहसास हुआ कि - तो मैं अब आपके दोनों समाधानों का संयोजन कर रहा हूं: बिल्ली $ लोगो sed -e '/ * \ // q' | sed -n '/ ^ \ / * /, / * \ / p' अफसोस की बात है, मैं आप दोनों को ठीक से क्रेडिट नहीं कर सकता।
AnC

@ एएनसी, आप कर सकते हैं: sed -n '/^\/*/,/*\// p' $LOGFILE | sed -e '/*\//q' और छोड़ें cat। लेकिन, मैं अभी इसके बारे में खुश नहीं हूं।
nik

1

यह हर फाइल को एक एक्सटेंशन के साथ देखता है .log और यदि पहली लाइन "/ *" है, तो केवल "*" वाली लाइन तक सब कुछ प्रिंट करें।

for file in *.log; do
      head -n1 $file | grep  -q '^/*' &&
      sed '/^\*\/$/q' $file; 
done

1
यह काम करता है - धन्यवाद! एक चेतावनी: यह काम नहीं करेगा अगर हेडर के ऊपर कुछ है, या यदि एक से अधिक टिप्पणी ब्लॉक हैं। हालाँकि, मुझे इस बारे में चिंता नहीं करनी चाहिए कि जब तक मुझे वास्तव में इसकी आवश्यकता नहीं है।
AnC

और अगर कोई हेडर नहीं है, तो यह पूरी फाइल को प्रिंट करेगा! बहुत सारे विफलता मोड हैं। शायद आप सवाल पूछ सकते हैं "मैं किसी फाइल में टिप्पणियों को कैसे प्रिंट कर सकता हूं?" (और कृपया हमें awk का उपयोग करने दें।)
Richard Hoskins

आप सही हैं - निक का समाधान उस संबंध में थोड़ा सुरक्षित लगता है, इसलिए मैं अभी के लिए इसका उपयोग करूंगा। एक बार फिर धन्यवाद!
AnC

मैंने अपनी सबसे खराब समस्याओं से छुटकारा पाने के लिए अपना जवाब अपडेट कर दिया है।
Richard Hoskins

दिलचस्प दृष्टिकोण। अब मैं इस और आपके दोनों समाधानों के संयोजन के बीच फटा हुआ हूं (ऊपर टिप्पणी देखें) ...
AnC

0
cat *.log | sed -e 's/*\/\*//g' -e 's/\*\///g' >> smt.log

वह यह हो सकता है


मुझे डर है कि केवल "* /" लाइन निकालता है। मैंने समान भावों के साथ प्रयोग किया है, लेकिन कहीं नहीं मिला - मुझे लगता है कि ऐसा इसलिए है क्योंकि sed एक लाइन-बाय-लाइन आधार पर काम करता है।
AnC

0

मामले में, अगर मेरी तरह आप Doxygen शैली टिप्पणियों को पुनः प्राप्त करने का प्रयास करते समय इस प्रश्न से टकरा गए, तो sed कमांड है:

sed -n '/^\/\*/p; /^ \*/p' < file

अधिक विस्तृत विवरण के लिए, मैं ब्लॉग इसके बारे में।

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