आपके द्वारा दिखाई गई फ़ाइल में एक पंक्ति में सभी विवरण हैं:
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 तक होगा!)।
.
कोई भी चरित्र, इसलिए किसी भी वर्ण का .*
प्रतिनिधित्व करता है।
;
शेल में, कमांड को अलग करता है।