खोज…


शैल चर का उपयोग कर प्रतिस्थापन

एकल उद्धरण के अंदर चर ' , POSIX संगत के गोले से विस्तार नहीं मिलता एक में एक खोल चर का उपयोग कर तो sed प्रतिस्थापन दोहरे उद्धरण चिह्नों के उपयोग की आवश्यकता " सिंगल कोट्स के बजाय ' :

$ var="he"
$ echo "hello" | sed "s/$var/XX/"
XXllo

$ var="he"
$ echo "hello" | sed 's/$var/XX/'
hello

चर का मूल्यांकन करते समय कमांड इंजेक्शन से सावधान रहें:

$ var='./&/;x;w/etc/passwd
> x;s/he'
$ echo "hello" | sed "s/$var/XX/"
sed: /etc/passwd: Permission denied

यदि उपरोक्त को रूट के रूप में चलाया जाता है तो आउटपुट पहले उदाहरण से अप्रभेद्य होता, और /etc/passwd की सामग्री नष्ट हो जाती।

Backreference

भागे हुए कोष्ठक का उपयोग करते हुए, आप एक कैप्चरिंग समूह को एक पैटर्न में परिभाषित कर सकते हैं जिसे प्रतिस्थापन स्ट्रिंग में backreferenced जा सकता है: \1

$ echo Hello world! | sed 's/\(Hello\) world!/\1 sed/'
Hello sed

कई समूहों के साथ:

$ echo one two three | sed 's/\(one\) \(two\) \(three\)/\3 \2 \1/'
three two one
BSD sed GNU sed

विस्तारित नियमित अभिव्यक्तियों का उपयोग करते समय ( अतिरिक्त विकल्प देखें) कोष्ठक डिफ़ॉल्ट रूप से समूहीकरण करते हैं, और बचना नहीं है:

$ echo one two three | sed -E 's/(one) (two) (three)/\3 \2 \1/'
three two one

अक्षर, अंक और अंडरस्कोर से मिलकर शब्दों को अभिव्यक्ति का उपयोग करके मिलान किया जा सकता है [[:alnum:]_]\{1,\} :

$ echo Hello 123 reg_exp | sed 's/\([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\)/\3 \2 \1/'
reg_exp 123 Hello
GNU sed

अनुक्रम \w [[:alnum:]_] बराबर है

$ echo Hello 123 reg_exp | sed 's/\(\w\w*\) \(\w\w*\) \(\w\w*\)/\3 \2 \1/'
reg_exp 123 Hello

विभिन्न सीमांकक का उपयोग करना

POSIX / IEEE ओपन ग्रुप बेस स्पेसिफिकेशन कहता है :

[2addr] s / BRE / प्रतिस्थापन / झंडे

पैटर्न स्पेस में BRE के उदाहरणों के लिए प्रतिस्थापन स्ट्रिंग को प्रतिस्थापित करें। BRE और प्रतिस्थापन को हटाने के लिए स्लैश के बजाय बैकस्लैश या न्यूलाइन के अलावा किसी भी वर्ण का उपयोग किया जा सकता है। BRE और प्रतिस्थापन के भीतर, BRE सीमांकक का उपयोग स्वयं एक शाब्दिक चरित्र के रूप में किया जा सकता है यदि यह बैकलैश से पहले हो।

ऐसे मामले हैं जब sed रिप्लेसमेंट के लिए सीमांकक / बीआर या प्रतिस्थापन में है, ट्रिगरिंग त्रुटियां जैसे:

$ echo "2/3/4" | sed "s/2/3/X/"
sed: -e expression #1, char 7: unknown option to `s'

इसके लिए, हम अलग-अलग सीमांकक जैसे कि # या _ या यहाँ तक कि एक स्थान का उपयोग कर सकते हैं:

$ echo "2/3/4" | sed "s#2/3#X#"
X/4
$ echo "2/3/4" | sed "s_2/3_X_"
X/4
$ echo "2/3/4" | sed "s 2/3 X "
X/4

पैटर्न झंडे - घटना प्रतिस्थापन

यदि हम एक पंक्ति में केवल पहली घटना को बदलना चाहते हैं, तो हम हमेशा की तरह sed उपयोग करते हैं:

$ cat example
aaaaabbbbb
aaaaaccccc
aaaaaddddd
$ sed 's/a/x/' example
xaaaabbbbb
xaaaaccccc
xaaaaddddd

लेकिन क्या होगा अगर हम सभी घटनाओं को बदलना चाहते हैं?

हम अंत में g पैटर्न ध्वज जोड़ते हैं:

$ sed 's/a/x/g' example
xxxxxbbbbb
xxxxxccccc
xxxxxddddd

और अगर हम एक विशिष्ट घटना को प्रतिस्थापित करना चाहते हैं, तो हम वास्तव में यह निर्दिष्ट कर सकते हैं कि कौन सा:

$ sed 's/a/x/3' example
aaxaabbbbb
aaxaaccccc
aaxaaddddd

/3 तीसरी घटना है।


GNU sed

info sed से, ऑनलाइन संस्करण के लिए GNU sed मैनुअल देखें

POSIX मानक निर्दिष्ट नहीं करता है कि जब आप g और NUMBER संशोधक को मिलाते हैं तो क्या होना चाहिए, और वर्तमान में व्यापक रूप से sed कार्यान्वयन के अर्थ पर कोई सहमति नहीं है। जीएनयू लिए sed , बातचीत परिभाषित किया गया है होना करने के लिए: NUMBERth से पहले मैचों पर ध्यान न दें, और उसके बाद से मेल खाते हैं और पर NUMBERth से सभी मिलान की जगह।

$ sed 's/b/y/2g' example
aaaaabyyyy
aaaaaccccc
aaaaaddddd

$ sed 's/c/z/g3' example
aaaaabbbbb
aaaaacczzz
aaaaaddddd


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow