क्यों sed सभी घटनाओं को प्रतिस्थापित नहीं करता है?


118

अगर मैं इस कोड को bash में चलाता हूं:

echo dog dog dos | sed -r 's:dog:log:'

यह आउटपुट देता है:

log dog dos

मैं इसे कुत्ते की सभी घटनाओं को कैसे बदल सकता हूं?


2
आपको gवैश्विक प्रतिस्थापन के लिए ध्वज की आवश्यकता है , आपको -rयहां विकल्प की आवश्यकता नहीं है ।
क्रिस सेमोर

जवाबों:


188

आपको gसंशोधक जोड़ना चाहिए, ताकि पैटर्न बफर की सामग्री का वैश्विक प्रतिस्थापन हो सके:

echo dog dog dos | sed -e 's:dog:log:g'

Sed पर एक शानदार प्रलेखन के लिए, http://www.grymoire.com/Unix/Sed.html देखें । इस वैश्विक ध्वज को यहां समझाया गया है: http://www.grymoire.com/Unix/Sed.html#uh-6

के लिए आधिकारिक प्रलेखन http://www.gnu.org/software/sed/manual/GNU sed पर उपलब्ध है


1
यहाँ GNU sed के लिए कॉर्नर केस जोड़ना: sed -E 's,foo,bar,g'वैश्विक चीज़ नहीं है। यदि आप इसे बदलने के लिए sed -E -e 's,foo,bar,g'यह काम करता है।
मेल्विन सोपाकुआ

23

आपको अंत में रखना gहोगा, यह "वैश्विक" के लिए खड़ा है:

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^

1
sed -e का उपयोग sed -r के बजाय किया जाना चाहिए, जो मौजूद नहीं है।
डायलन डेनियल

1
@DylanDaniels उबंटू के अनुसार man sed, -rविकल्प का अर्थ है "विस्तारित नियमित अभिव्यक्ति का उपयोग करें"। तो दी गई कमांड ठीक काम करती है, हालांकि इसे काम करने के लिए विस्तारित नियमित अभिव्यक्तियों की सुविधाओं की आवश्यकता नहीं है।
क्रेग मैकक्वीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.