sed
प्रतिस्थापन
खोज…
शैल चर का उपयोग कर प्रतिस्थापन
एकल उद्धरण के अंदर चर '
, 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
विस्तारित नियमित अभिव्यक्तियों का उपयोग करते समय ( अतिरिक्त विकल्प देखें) कोष्ठक डिफ़ॉल्ट रूप से समूहीकरण करते हैं, और बचना नहीं है:
$ 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
अनुक्रम \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
तीसरी घटना है।
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