कमांड सेड के उपयोग के बिना स्ट्रिंग को कैसे खोजें और बदलें?


16

जैसा कि हम सभी जानते हैं, sedस्ट्रिंग को खोजने और बदलने के लिए बहुत कुशल है, उदाहरण के लिए 'a' को खोजें और इसे 'b' में बदलें sed 's/a/b/g'

क्या इसके बजाय अन्य कमांड या शेल स्क्रिप्ट के साथ ऐसा करना संभव है sed?

यह टीवी के लिए क्रॉप्ड लिनक्स सिस्टम के लिए है जिसमें sedकमांड नहीं है । इसलिए मुझे इसके बजाय अन्य कमांड या स्क्रिप्ट का उपयोग करना होगाsed 's/a/b/g'. –


दरअसल, यह सिर्फ नियमित अभिव्यक्ति आधारित प्रतिस्थापन है। किसी भी उपकरण या भाषा ऐसी बात को संभालने के लिए सक्षम भी ऐसा ही करने में सक्षम हो, लेकिन विभिन्न वाक्य रचना के साथ: $var=~s/a/b/g, gsub(/a/,"b",var), var.gsub(/a/,'b'), var.replace(/a/g,'b'), preg_replace("/a/","b",$var), regsub -all a b $var। इसके अलावा, कई उपकरण और भाषाएं भी सादे पाठ स्ट्रिंग प्रतिस्थापन कर सकते हैं। तो आपका प्रश्न किसी तरह व्यापक है।
मैनटवर्क

1
क्यों? आप कौनसी समस्याएं हल करने की कोशिश कर रहे हैं?
गाइल्स का SO- बुराई से रूबरू होना '

टीवी के लिए क्रॉप किए गए लिनक्स सिस्टम में सेड कमांड नहीं है। इसलिए मुझे sed 's / a / b / g' के बजाय अन्य कमांड या स्क्रिप्ट का उपयोग करना होगा।
बिंगेनज़क

जवाबों:


12

हां ऐसा करने के कई तरीके हैं। आप इन गतिविधियों का उपयोग कर सकते हैं awk, perlया कर सकते हैं bash। सामान्य तौर पर हालांकि sedइस प्रकार के कार्यों को करने के लिए संभवतः सबसे एप्रोपोस टूल है।

उदाहरण

कहो कि मेरे पास यह नमूना डेटा है, एक फ़ाइल में data.txt:

foo bar 12,300.50
foo bar 2,300.50
abc xyz 1,22,300.50

awk

$ awk '{gsub("foo", "foofoofoo", $0); print}' data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50

पर्ल

$ perl -pe "s/foo/foofoofoo/g" data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50

इनलाइन संपादन

उपरोक्त उदाहरण सीधे फाइलों को भी संशोधित कर सकते हैं। पर्ल का उदाहरण तुच्छ है। बस -iस्विच जोड़ें ।

$ perl -pie "s/foo/foofoofoo/g" data.txt 

इसके लिए awkयह थोड़ा कम प्रत्यक्ष है लेकिन उतना ही प्रभावी है:

$ { rm data.txt && awk '{gsub("foo", "foofoofoo", $0); print}' > data.txt; } < data.txt

यह विधि ब्रेसेस '{...}' के साथ एक उप-शेल बनाती है, जहाँ फ़ाइल को इसके माध्यम से पुनर्निर्देशित किया जाता है:

$ { ... } < data.txt

एक बार फ़ाइल को उप-शेल में रीडायरेक्ट कर दिया गया है, इसे हटा दिया गया है और फिर awkउस फ़ाइल की सामग्री के खिलाफ चलाया जाता है जिसे सब-शेल स्टैटिन में पढ़ा गया था। इस सामग्री को तब संसाधित किया जाता है awkऔर उसी फ़ाइल नाम से वापस लिखा जाता है जिसे हमने अभी हटा दिया है, प्रभावी रूप से प्रतिस्थापित कर रहा है।


आपके उत्तर के लिए धन्यवाद और मैं इसे अगले कार्यदिवस में आज़माऊंगा। लेकिन मुझे यकीन नहीं है कि यह काम करेगा क्योंकि कुछ कमांड शायद टीवी के क्रॉप्ड लिनक्स सिस्टम में मौजूद नहीं हैं, जैसे कि 'sed'.So मैं अभी भी कमांड' खोज 'का उपयोग करना चाहता हूं। , 'grep' और इतने पर इसे हल करने के लिए।
binghenzq

@binghenzq - मैंने ऐसे उदाहरण जोड़े हैं जो इनलाइन फ़ाइल को संपादित करते हैं।
स्लम

-1 मैं शायद ही कभी नीचा दिखाऊं लेकिन इस मामले में सवाल का बिंदु अन्य अधिक / समान रूप से जटिल और संभावित रूप से निर्भर होने के बजाय एक सरल तरीका प्रतीत हुआ। अगर सवाल सिर्फ एक पूर्ण * निक्स मशीन स्थापित करने के विकल्प के बारे में था तो मैं शायद यह अन्यथा अच्छा जवाब +1 करूंगा।
माइकल ड्यूरेंट

@MichaelDurrant - मैंने अभी उन विस्तृत इनलाइन संपादन बी / सी को जोड़ा है जो ओपी ने उनके लिए कहा था। इसके अलावा ओपी की आवश्यकता को सेट नहीं का उपयोग कर sedनहीं आई Sed इस जैसे प्रतिस्थापन करने के लिए उपयुक्त उपकरण है, और वह स्पष्ट रूप से बेहतर है, इन उपकरणों की भूमिका को समझने के लिए इतना इन बातों हालांकि बुरा दिखा कोई पूछ रहा है, दिखाने में अत्यंत शिक्षा हैं उन्हें क्यों। बहुत बार पता है कि ppl में केवल "मैं यह नहीं करता" क्यों समझाए बिना कहता हूं, इसलिए मैं हूं। लेकिन कम से कम एक टिप्पणी छोड़ने के लिए धन्यवाद क्यों आप डीवी।
स्लम

निश्चित रूप से, मुझे लगा कि यह अन्य सभी मामलों में एक महान जवाब है। हाँ, मुझे कोई स्पष्टीकरण नहीं के साथ -1 से नफरत है।
माइकल दुरंत

13

एकल अक्षर प्रतिस्थापन के लिए क्लासिक विकल्प वह trकमांड है जो किसी भी सिस्टम के बारे में उपलब्ध होना चाहिए:

$ echo "foobar" | tr a b   
foobbr

trsedवास्तव में इसका उपयोग तब से बेहतर है जब तक sedकि एकल पत्र प्रतिस्थापन के लिए उपयोग (अकेले perlया दो awk) एक मक्खी को मारने के लिए स्लेज हथौड़ा का उपयोग करने जैसा है।

grep इसके लिए डिज़ाइन नहीं किया गया है, यह इसके इनपुट को संशोधित नहीं करता है, यह केवल इसके माध्यम से खोज करता है।

वैकल्पिक रूप से, आप कुछ गोले की प्रतिस्थापन क्षमताओं का उपयोग कर सकते हैं । यहाँ का उपयोग ksh, zshया bashवाक्य रचना:

$ foo="foobar"
$ echo "${foo//a/b}"
foobbr

हम आपको और अधिक विशिष्ट उत्तर दे सकते हैं यदि आपने ठीक से समझाया कि आप किस समस्या को हल करने की कोशिश कर रहे हैं।


क्या मामले को अनदेखा करने का कोई विकल्प है ${foo//a/b}?
एलिकएल्ज़िन-किलाका

@ AlikElzin-kilaka मुझे डर है कि नहीं। आपको कुछ अधिक परिष्कृत उपयोग करना होगा जैसे, उदाहरण के लिए: echo "$foo" | sed 's/a/b/iया वर्ण वर्ग दें echo ${foo//[aA]/b}:।
terdon

4

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -s -c '%s/a/b/g|x' file
  1. % सभी लाइनों का चयन करें

  2. s विकल्प

  3. g वैश्विक प्रतिस्थापन

  4. x सहेजें और बंद करें


बहुत धन्यवाद। बस जोड़ने के लिए, -c ध्वज कमांड को निष्पादित करना है जब संपादन शुरू होता है (चूंकि पूर्व एक संपादक है) और -s झंडा या तो स्क्रिप्ट मोड है जो प्रतिक्रिया को अक्षम कर रहा है या कुछ को स्लि-मोड कहना पसंद करता है। अधिक जानकारी के लिए देखें: ex-vi.sourceforge.net/ex.html
जिमी एमजी लिम

3

यदि आप स्ट्रीम के बजाय फ़ाइल के साथ काम कर रहे हैं, तो आप मानक टेक्स्ट एडिटर का उपयोग कर सकते हैं ed:

printf '%s\n' ',s/a/b/g' w q | ed file.txt

यह किसी भी * निक्स पर उपलब्ध होना चाहिए। कॉमा हर लाइन पर काम करने के लिए ',s/a/b/g'कहती edहै (आप भी इस्तेमाल कर सकते हैं , जो आपके परिचित होने पर अधिक परिचित होगा), और बाकी यह एक मानक खोज और प्रतिस्थापन है। इसे फ़ाइल को लिखने (सहेजने) के लिए कहता है , इसे बाहर निकलने के लिए कहता है।%wq

ध्यान दें कि, sed के -iविकल्प के विपरीत (और अन्य उपकरणों में समान विकल्प), यह वास्तव में अस्थायी फ़ाइलों के साथ धोखा देने के बजाय फ़ाइल को अंदर संपादित करता है।

मुझे नहीं लगता कि धाराओं के साथ यह काम करना संभव है, लेकिन तब मुझे वास्तव में इसके बारे में ज्यादा जानकारी नहीं है edऔर मुझे आश्चर्य नहीं होगा अगर यह वास्तव में वह क्षमता (यूनिक्स दर्शन क्या है)।


2

पूर्वज कमांड का उपयोग करना (जिसमें -sशांत (चुप) और कमांड से पहले अल्पविराम का अर्थ है सभी लाइनों पर निष्पादित)

बस STDOUT पर मुद्रण :

ed -s file <<!
,s/a/b/g
,p
q
!

जगह में जगह:

ed -s file <<!
,s/a/b/g
w
q
!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.