स्ट्रीम संपादक - नियमित अभिव्यक्तियाँ

यह नियमित अभिव्यक्ति है जो SED को शक्तिशाली और कुशल बनाती है। नियमित अभिव्यक्ति के साथ कई जटिल कार्यों को हल किया जा सकता है। कोई भी कमांड-लाइन विशेषज्ञ नियमित अभिव्यक्ति की शक्ति जानता है।

कई अन्य GNU / लिनक्स उपयोगिताओं की तरह, SED भी नियमित अभिव्यक्तियों का समर्थन करता है, जिन्हें अक्सर के रूप में संदर्भित किया जाता है regex। यह अध्याय नियमित भावों का विस्तार से वर्णन करता है। अध्याय को तीन खंडों में विभाजित किया गया है: मानक नियमित अभिव्यक्ति, नियमित अभिव्यक्ति के POSIX वर्ग और मेटा वर्ण।

मानक नियमित अभिव्यक्ति

लाइन की शुरुआत (^)

नियमित अभिव्यक्ति शब्दावली में, कैरेट (^) प्रतीक एक रेखा की शुरुआत से मेल खाता है। निम्न उदाहरण उन सभी पंक्तियों को प्रिंट करता है जो पैटर्न "द" से शुरू होती हैं।

[jerry]$ sed -n '/^The/ p' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho

लाइन का अंत ($)

लाइन का अंत डॉलर ($) प्रतीक द्वारा दर्शाया गया है। निम्नलिखित उदाहरण "कोएलहो" के साथ समाप्त होने वाली रेखाओं को प्रिंट करता है।

[jerry]$ sed -n '/Coelho$/ p' books.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

The Alchemist, Paulo Coelho 
The Pilgrimage, Paulo Coelho

एकल चरित्र (।)

रेखा वर्ण के अंत को छोड़कर किसी भी एकल वर्ण से मिलान करता है। निम्नलिखित उदाहरण सभी तीन अक्षर शब्दों को प्रिंट करता है जो चरित्र "टी" के साथ समाप्त होते हैं।

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

cat 
bat 
rat 
mat

मैच चरित्र सेट ([])

नियमित अभिव्यक्ति शब्दावली में, वर्ग कोष्ठक ([]) द्वारा एक वर्ण सेट का प्रतिनिधित्व किया जाता है। इसका उपयोग कई पात्रों में से केवल एक से मेल खाने के लिए किया जाता है। निम्न उदाहरण "कॉल" और "लंबा" पैटर्न से मेल खाता है, लेकिन "बॉल" नहीं।

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

Call 
Tall

विशेष सेट ([^])

अनन्य सेट में, वर्गाकार कोष्ठक में वर्णों के समुच्चय को नकारता है। निम्नलिखित उदाहरण केवल "बॉल" प्रिंट करता है।

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

Ball

चरित्र रेंज ([-])

जब कोई वर्ण श्रेणी प्रदान की जाती है, तो नियमित अभिव्यक्ति वर्ग कोष्ठक में निर्दिष्ट सीमा के भीतर किसी भी वर्ण से मेल खाती है। निम्नलिखित उदाहरण "कॉल" और "लंबा" से मेल खाता है लेकिन "बॉल" नहीं।

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

Call 
Tall

अब हम "AP" की सीमा को संशोधित करते हैं और परिणाम का निरीक्षण करते हैं।

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

Call 
Ball

शून्य पर एक घटना (\?)

SED में, प्रश्न चिह्न (\?) पूर्ववर्ती चरित्र के शून्य या एक घटना से मेल खाता है। निम्नलिखित उदाहरण "व्यवहार" के साथ-साथ "व्यवहार" से मेल खाता है। यहाँ, हमने "\" का उपयोग करके एक वैकल्पिक चरित्र के रूप में "यू" बनाया।

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

Behaviour 
Behavior

एक या अधिक घटना (\ +)

SED में, प्लस चिन्ह (\ +) पूर्ववर्ती चरित्र की एक या अधिक घटनाओं से मेल खाता है। निम्न उदाहरण "2" की एक या अधिक घटनाओं से मेल खाता है।

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

22 
123 
234 
222

शून्य या अधिक घटना (*)

तारांकन (*) पूर्ववर्ती चरित्र के शून्य या अधिक घटना से मेल खाता है। निम्न उदाहरण "सीए", "कैट", "कैट", और इसी तरह से मेल खाता है।

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

ca 
cat

बिल्कुल एन अवसरों {n}

{n} पूर्ववर्ती चरित्र की "n" घटनाओं से बिल्कुल मेल खाता है। निम्नलिखित उदाहरण केवल तीन अंकों की संख्या छापता है। लेकिन इससे पहले, आपको निम्न फ़ाइल बनाने की आवश्यकता है जिसमें केवल संख्याएं हैं।

[jerry]$ cat numbers.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

1 
10 
100 
1000 
10000 
100000 
1000000 
10000000 
100000000 
1000000000

हमें SED अभिव्यक्ति लिखें।

[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

100

ध्यान दें कि घुंघराले ब्रेसिज़ की जोड़ी "\" वर्ण से बच जाती है।

कम से कम n अवसर {n,}

{n}, पूर्ववर्ती वर्ण की कम से कम "n" घटनाओं से मेल खाता है। निम्न उदाहरण सभी संख्याओं को पाँच अंकों से अधिक या उसके बराबर प्रिंट करता है।

[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

10000 
100000 
1000000
10000000 
100000000 
1000000000

M से N अवसर {m, n}

{m, n} पूर्ववर्ती वर्ण की कम से कम "मी" और अधिकांश "एन" घटनाओं से मेल खाता है। निम्नलिखित उदाहरण में कम से कम पांच अंकों वाले सभी नंबरों को प्रिंट किया गया है लेकिन आठ अंकों से अधिक नहीं है।

[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

10000 
100000 
1000000 
10000000

पाइप (|)

SED में, पाइप वर्ण तार्किक या ऑपरेशन की तरह व्यवहार करता है। यह पाइप के दोनों ओर की वस्तुओं से मेल खाता है। निम्न उदाहरण या तो "str1" या "str3" से मेल खाता है।

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

str1 
str3

ध्यान दें कि कोष्ठक और पाइप (!) की जोड़ी "\" वर्ण से बच जाती है।

पात्र बचाना

कुछ विशेष पात्र हैं। उदाहरण के लिए, न्यूलाइन को "\ n" द्वारा दर्शाया जाता है, गाड़ी का रिटर्न "\ r" द्वारा दर्शाया जाता है, और इसी तरह। इन पात्रों को नियमित ASCII संदर्भ में उपयोग करने के लिए, हमें उन्हें पिछड़े स्लैश (\) वर्ण का उपयोग करके बचना होगा। यह अध्याय विशेष पात्रों के भागने का चित्रण करता है।

"\" बचना

निम्न उदाहरण पैटर्न "\" से मेल खाता है।

[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

str1\str2

बचना "\ n"

निम्न उदाहरण नई लाइन वर्ण से मेल खाता है।

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

str1\nstr2

बचना "\ r"

निम्न उदाहरण गाड़ी वापसी से मेल खाता है।

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

str1\rstr2

"Dnnn" को बचाना

यह एक ऐसे चरित्र से मेल खाता है जिसका दशमलव ASCII मान "nnn" है। निम्नलिखित उदाहरण केवल चरित्र "ए" से मेल खाता है।

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

a

बचना "\ onnn"

यह एक ऐसे चरित्र से मेल खाता है, जिसका अष्टक ASCII मान "nnn" है। निम्नलिखित उदाहरण केवल चरित्र "बी" से मेल खाता है।

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

b

यह एक ऐसे चरित्र से मेल खाता है जिसका हेक्साडेसिमल ASCII मान "nnn" है। निम्नलिखित उदाहरण केवल चरित्र "सी" से मेल खाता है।

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

c

नियमित अभिव्यक्तियों के POSIX कक्षाएं

कुछ निश्चित शब्द हैं जिनका विशेष अर्थ है। इन आरक्षित शब्दों को नियमित अभिव्यक्ति के POSIX वर्गों के रूप में संदर्भित किया जाता है। यह खंड SED द्वारा समर्थित POSIX वर्गों का वर्णन करता है।

[: Alnum:]

इसका अर्थ है वर्णमाला और संख्यात्मक वर्ण। निम्न उदाहरण केवल "एक" और "123" से मेल खाता है, लेकिन टैब वर्ण से मेल नहीं खाता है।

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

One 
123

[: अल्फा:]

इसका तात्पर्य केवल वर्णमाला वर्णों से है। निम्नलिखित उदाहरण केवल "वन" शब्द से मेल खाता है।

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

One

[: रिक्त:]

इसका तात्पर्य रिक्त चरित्र से है जो अंतरिक्ष या टैब हो सकता है। निम्न उदाहरण केवल टैब वर्ण से मेल खाता है।

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

^I$

ध्यान दें कि कमांड "कैट -vte" का उपयोग टैब वर्ण (^ I) को दिखाने के लिए किया जाता है।

[:अंक:]

इसका तात्पर्य केवल दशमलव संख्या है। निम्नलिखित उदाहरण केवल "123" अंक से मेल खाता है।

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

123

[: कम:]

इसका तात्पर्य लोअरकेस अक्षर से ही है। निम्नलिखित उदाहरण केवल "एक" से मेल खाता है।

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

one

[ऊपरी:]

इसका तात्पर्य अपरकेस अक्षरों से ही है। निम्न उदाहरण केवल "TWO" से मेल खाता है।

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

TWO

[: Punct:]

इसका तात्पर्य विराम चिह्न से है जिसमें गैर-स्थान या अल्फ़ान्यूमेरिक वर्ण शामिल हैं

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

One,Two

[: अंतरिक्ष:]

इसका मतलब है कि व्हॉट्सएप के पात्र। निम्न उदाहरण यह दिखाता है।

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

123^L^I$

अक्षरों से परे

पारंपरिक नियमित अभिव्यक्तियों की तरह, SED भी मेटाचैटर्स का समर्थन करता है। ये पर्ल स्टाइल रेगुलर एक्सप्रेशन हैं। ध्यान दें कि मेटाचैकर समर्थन जीएनयू एसईडी विशिष्ट है और एसईडी के अन्य वेरिएंट के साथ काम नहीं कर सकता है। आइए हम विस्तार से चर्चा करते हैं।

शब्द सीमा (\ b)

नियमित अभिव्यक्ति शब्दावली में, "\ b" शब्द सीमा से मेल खाता है। उदाहरण के लिए, "\ bthe \ b" "लेकिन नहीं" इन "," वहाँ "," वे "," फिर ", और इसी तरह से मेल खाता है। निम्न उदाहरण यह दिखाता है।

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

the

गैर-शब्द सीमा (\ B)

नियमित अभिव्यक्ति शब्दावली में, "\ B" गैर-शब्द सीमा से मेल खाता है। उदाहरण के लिए, "द बी" "इन" और "वे" से मेल खाता है, लेकिन "" से नहीं। निम्न उदाहरण यह दिखाता है।

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

these 
they

सिंगल व्हाट्सएप (\ _)

SED में, "\ _" एकल व्हाट्सएप चरित्र का अर्थ है। निम्न उदाहरण "लाइन \ t1" से मेल खाता है, लेकिन "लाइन 1" से मेल नहीं खाता है।

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

Line 1

एकल गैर-व्हाट्सएप (\ S)

SED में, "\ _" एकल व्हाट्सएप चरित्र का अर्थ है। निम्न उदाहरण "लाइन 2" से मेल खाता है लेकिन "लाइन \ t1" से मेल नहीं खाता है।

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

Line2

एकल शब्द चरित्र (\ w)

SED में, "\ w" का अर्थ है एकल शब्द वर्ण, अर्थात, वर्णमाला वर्ण, अंक और अंडरस्कोर (_)। निम्न उदाहरण यह दिखाता है।

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

One 
123 
1_2

एकल गैर-शब्द चरित्र (\ W)

SED में, "\ W" एकल गैर-शब्द वर्ण का अर्थ है जो "\ w" के बिल्कुल विपरीत है। निम्न उदाहरण यह दिखाता है।

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

&;#

पैटर्न स्पेस की शुरुआत (\ `)

SED में, "\ _" का अर्थ है पैटर्न स्पेस की शुरुआत। निम्नलिखित उदाहरण केवल "वन" शब्द से मेल खाता है।

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'

उपरोक्त कोड निष्पादित करने पर, आपको निम्न परिणाम मिलते हैं:

One