आपके द्वारा दिखाई गई फ़ाइल में एक पंक्ति में सभी विवरण हैं:
name : farah age : 23 phone number : 0123 education : degree
मैंने मान लिया है कि आप हार्ड-कोड age :आदि को कमांड में रख सकते हैं , लेकिन इसके बाद का पाठ अलग-अलग होगा, और यह कि विवरण दिए गए क्रम में नहीं हो सकता है या सन्निहित नहीं हो सकता है।
आप के साथ लाइन के कुछ हिस्सों निकाल सकते हैं grepके -oझंडा। यह पूरी लाइन के बजाय केवल मिलान किए गए भाग को प्रिंट करता है।
यदि आप age :और phone number :भागों को शामिल करना चाहते हैं , तो आप या तो -eकई मैचों को निर्दिष्ट करने के लिए या वैकल्पिक रूप से ध्वज का उपयोग कर सकते हैं ।
$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123
अभिव्यक्ति का [^ ]*अर्थ है किसी भी संख्या में वर्ण जो एक स्थान नहीं है, इसलिए यह age :अगले स्थान तक वर्णों से मेल खाता है।
fileउस फ़ाइल के नाम से बदलें जिसमें आपका विवरण है। आप >इस तरह से ऑपरेटर के साथ एक नई फ़ाइल के लिए आउटपुट पुनर्निर्देशित करके नई फ़ाइल लिख सकते हैं :
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
जब आप ऐसा करेंगे, तो आपको कोई आउटपुट नहीं दिखेगा। आपको पहले आउटपुट की जांच करनी चाहिए, फिर रीडायरेक्शन को जोड़ना चाहिए।
यहाँ उदाहरण के साथ प्रत्यावर्तन है। हम विस्तारित रेगेक्स का उपयोग करने के -Eलिए बताने के grepलिए ध्वज का उपयोग करते हैं । वाक्यविन्यास है (pattern1|pattern2)- यह मेल खाता है pattern1और / या pattern2। यदि या तो पाया जाता है, तो इसे मुद्रित किया जाएगा (भले ही यह पाया जाए कि क्या अन्य पाया गया है या नहीं)। अब मैं +पूर्ववर्ती चरित्र के कम से कम एक अर्थ का उपयोग कर रहा हूं , *अर्थ शून्य या पूर्ववर्ती चरित्र के बजाय । इस संदर्भ में, वे दोनों समान रूप से अच्छी तरह से काम करते हैं।
$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23
phone number : 0123
यदि आप भागों age :और phone number:भागों को छोड़ना चाहते हैं , तो आप -Pध्वज grepका उपयोग पर्ल-संगत नियमित अभिव्यक्तियों का उपयोग करने के लिए कह सकते हैं । यह विकल्प का समर्थन करता है, और दिए गए पैटर्न के बाद पाठ के मिलान का एक तरीका भी है :
$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123
यदि आप पाठ को अलग तरीके से प्रारूपित करना चाहते हैं, तो आप sedउदाहरण के लिए उपयोग कर सकते हैं :
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123
यह ageपहले आने पर निर्भर करता है phone number, इसलिए यदि ऐसा नहीं है तो तदनुसार समायोजित करें। यदि आप आदेश पर भरोसा नहीं कर सकते हैं, तो आप इस बहुत जटिल कमांड का उपयोग कर सकते हैं:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23
यह लाइन को फिर से व्यवस्थित करता है ताकि phone number :अनुभाग हर पंक्ति पर पहले आए, फिर वांछित विवरणों का चयन करने के लिए दूसरा प्रतिस्थापन करता है। मैं यहाँ इस तकनीक का श्रेय इस उत्तर के लिए देता हूँ ।
sedपिछले स्पष्टीकरण द्वारा कवर नहीं किए गए आदेशों पर नोट्स
-rअधिक पठनीय आदेशों के लिए विस्तारित रेगेक्स का उपयोग करें (GNU एक ही अर्थ के साथ sedसमझता -Eहै)
s/old/new/के oldसाथ बदलेंnew
(pattern)patternबाद में \1या इसके साथ संदर्भ के लिए बचाता है \2(बाएं-से-दाएं क्रम के अनुसार) जिसमें कैप्चर समूह होते हैं - ध्यान दें कि sedइनमें से केवल 7 तक होगा!)।
.कोई भी चरित्र, इसलिए किसी भी वर्ण का .*प्रतिनिधित्व करता है।
; शेल में, कमांड को अलग करता है।