sed पूरे शब्द खोज और प्रतिस्थापित करें


120

मैं sed का उपयोग करके पूरे शब्दों को कैसे खोज और बदल सकता हूँ?

करते हुए

sed -i 's/[oldtext]/[newtext]/g' <file> 

आंशिक मैचों की भी जगह लेगा [oldtext]जो मैं नहीं करना चाहता।

जवाबों:


164

नियमित अभिव्यक्तियों में \ b शब्द सीमाओं से मेल खाता है (अर्थात पहले शब्द चरित्र और गैर-शब्द चरित्र के बीच का स्थान):

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment


@OlegMazko मैं भी विम में उपयोग करने के लिए पॉज़िक्स स्वीकार्य विधि की तलाश में आया था और मेरे लिए जो काम किया वह s / \ <7 // g था। मैं अपने कोड में एक शब्द के शुरू में 7 को हटाने की कोशिश कर रहा था। इस लिंक, विशेष रूप से, जेपी के समाधान ने मुझे उत्तर दिया: stackoverflow.com/questions/3864467/… (किसी कारण से इसे आपकी तरह एम्बेड करने के लिए मार्कडाउन नहीं मिल सका)।
जीम

धन्यवाद, मैं पागल हो रहा था शब्द पर एक प्रतिस्थापन करने की कोशिश कर रहा था "और" इसलिए \band\bदिन बचाया :)
मिशेल

144

मैक ओएस एक्स पर, न तो इन regex वाक्यविन्यास के अंदर काम sed पूरे शब्द मिलान के लिए

  • \bmyWord\b
  • \<myWord\>

मुझे अभी सुनें और बाद में विश्वास करें, यह बदसूरत सिंटैक्स है जिसे आपको उपयोग करने की आवश्यकता है:

  • /[[:<:]]myWord[[:>:]]/

तो, उदाहरण के लिए, को बदलने के लिए टकसाल के साथ मिन्टी केवल संपूर्ण शब्दों के लिए:

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

स्रोत: re_format man पेज


19
बस sedMacPorts या Homebrew के माध्यम से GNU (और हर दूसरे GNU टूल) को स्थापित करें और सुनिश्चित करें कि यह आपके पहले नंबर पर आता है PATH। मैक को काफी प्रयोग करने योग्य बनाना संभव है।
जिम स्टीवर्ट

9
@JimStewart उपकरणों का एक गुच्छा तोड़ने का शानदार तरीका, जो यह मानता है कि 'जब OS X पर हो, तो OS Xers के रूप में करें।' उस ने कहा, मैं निश्चित रूप से सुझाव दे सकता हूं brew install coreutils, जो सभी ग्नू उपकरण का उपसर्ग करता है।
ELLIOTTCABLE

16
brew install gnu-sedका उपयोग करने के लिएgsed
k107

काढ़ा coreutils कमाल है। क्या कोई अन्य काढ़ा पैकेज है जो कमांडों के गनु संस्करणों का एक पूरा गुच्छा स्थापित करता है या मुझे बाकी को व्यक्तिगत रूप से स्थापित करने की आवश्यकता है?
ckot

2
पर्ल का उपयोग करना हमेशा एक बेहतर उपाय होता है perl -pe 's|\bone\b|two|g':। जबकि यहाँ और वहाँ sed विफल रहता है stably काम करता है।
पावेल वलसोव

13

\bशब्द सीमाओं के लिए उपयोग करें :

sed -i 's/\boldtext\b/newtext/g' <file>

3
से सावधान रहें []: o,l-> [newtext],[newtext]। आप स्पष्ट रूप से मतलब है sed -i 's/\boldtext\b/newtext/g'
JJoao

7

मेरी एक मशीन में, " \b" (बिना उद्धरण के) शब्द के परिसीमन ने काम नहीं किया। समाधान \<परिसीमन शुरू करने के लिए और " \>" परिसीमन समाप्त करने के लिए उपयोग करना था ।

जोकिम लुंडबर्ग के उदाहरण के साथ समझाने के लिए:

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment

2

शेल कमांड में:

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

या:

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

लेकिन अगर आप विम में हैं, तो आप केवल बाद में उपयोग कर सकते हैं:

:% s/\<old\>/new/g

-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment

ओपी स्पष्ट रूप से "sed का उपयोग कर रहा है"
ndemou

यह एक विभाजित-जोड़-तोड़ है, न कि एक शुद्ध प्रतिस्थापन; यह एक में कई स्पेस को ध्वस्त करता है और किसी भी लीडिंग / ट्रेलिंग स्पेस को डिस्क्राइब करता है: जैसे echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Eदेता है no bar embarassment$
मुशीफिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.