@ ईडी मॉर्टन: मैं यहां आपसे असहमत हूं। मुझे sed
बहुत उपयोगी और सरल मिला (एक बार जब आप पैटर्न की अवधारणा को टटोलते हैं और बफ़र्स को पकड़ते हैं) तो बहुस्तरीय हरियाणवी करने के लिए एक सुरुचिपूर्ण तरीके के साथ आते हैं।
उदाहरण के लिए, चलिए एक टेक्स्ट फाइल लेते हैं जिसमें होस्टनाम और प्रत्येक होस्ट के बारे में कुछ जानकारी होती है, जिसके बीच में बहुत सारे कबाड़ होते हैं जिनकी मुझे परवाह नहीं है।
Host: foo1
some junk, doesnt matter
some junk, doesnt matter
Info: about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Info: a second line about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Host: foo2
some junk, doesnt matter
Info: about foo2 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
मेरे लिए, होस्टनाम के साथ लाइनों को प्राप्त करने के लिए एक awk स्क्रिप्ट और संबंधित info
लाइन मुझे sed के साथ जो करने में सक्षम है, उससे थोड़ा अधिक लगेगा:
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
आउटपुट जैसा दिखता है:
Host: foo1
Info: about foo1 that I really care about!!
Host: foo1
Info: a second line about foo1 that I really care about!!
Host: foo2
Info: about foo2 that I really care about!!
(ध्यान दें कि Host: foo1
आउटपुट में दो बार दिखाई देता है।)
स्पष्टीकरण:
-n
स्पष्ट रूप से मुद्रित होने तक आउटपुट अक्षम करता है
- पहला मैच,
Host:
लाइन को होल्ड बफ़र (h) में पाता और डालता है
- दूसरा मैच, अगली जानकारी पाता है: लाइन, लेकिन पहले बफर (x) पैटर्न बफर में वर्तमान लाइन होल्ड बफर के साथ, और प्रिंट (पी)
Host:
लाइन, फिर फिर से एक्सचेंज (एक्स) और प्रिंट (पी) इन्फो: लाइन।
हां, यह एक सरलीकृत उदाहरण है, लेकिन मुझे संदेह है कि यह एक सामान्य मुद्दा है जिसे एक साधारण सेड वन-लाइनर द्वारा जल्दी से निपटा दिया गया था। बहुत अधिक जटिल कार्यों के लिए, जैसे कि आप किसी दिए गए, अनुमानित अनुक्रम पर भरोसा नहीं कर सकते हैं, जाग बेहतर अनुकूल हो सकता है।
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'