केवल उन पंक्तियों को कैसे सीना है जिसमें स्ट्रिंग दी गई है?


13

इनपुट:

Select ASDF 325 sdfg sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg sdfg 4456 sdrg

उत्पादन:

Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg

तो संक्षेप में मुझे "XXX" के लिए "sdf" "sdfg" की आवश्यकता है।

लेकिन: केवल उन पंक्तियों में, जिनमें "एएसडीएफ का चयन करें" स्ट्रिंग शामिल है .. मैं यह कैसे कर सकता हूं? (sed, awk, आदि: \)

जवाबों:


19

आप उन पंक्तियों को सीमित करने के लिए एक पते के साथ सबसे सीड कमांड को उपसर्ग कर सकते हैं, जिस पर वे लागू होते हैं। एक पता एक पंक्ति संख्या, या एक regex द्वारा सीमांकित किया जा सकता है /

cat INPUT | sed '/Select ASDF/ s=sdfg=XXXX='

जैसा कि पीटरो ने उल्लेख किया है, जैसा कि ऊपर लिखा गया आदेश sdfgस्ट्रिंग वाले में किसी भी पहली घटना को प्रतिस्थापित करेगा Select ASDF। यदि आपको सटीक मिलान को sdfgकेवल उस स्थिति में बदलना है, जब वह चौथे कॉलम में हो, तो आपको इस तरह से जाना चाहिए:

cat INPUT | sed 's/\(^Select ASDF [^ ]* \)sdfg /\1XXXX /'

1
Sdfg वाले किसी अन्य फ़ील्ड के बारे में क्या ? जैसे। 5sdfga
पीटर।

हम्म, वास्तव में यह समस्या भी नहीं है। मैंने अपना उत्तर अपडेट कर दिया है।
भीड़

क्या उपयोग करने के लिए कोई विकल्प हैं: sed '/ Select ASDF / gs = sdfg = XXXX =' - इसलिए मुझे केवल एक ही नहीं बल्कि सभी आवृत्तियों को एक पंक्ति में बदलने की आवश्यकता है। लेकिन अगर मैं "g" का उपयोग करता हूँ तो sed त्रुटि देता है
LanceBaynes

1
आपको gअंतिम =( sकमांड के अंत में ) टाइप करने की आवश्यकता है । : यह इस तरह हो जाएगाsed '/Select ASDF/ s=sdfg=XXXX=g'
भीड़

7

यदि आप केवल कॉलम 4 बदल रहे हैं यदि इसका सटीक मूल्य है, तो नियमित अभिव्यक्ति के बजाय समानता ऑपरेटरों का उपयोग करना समझ में आता है।

awk '$1 == "Select" && $2 == "ASDF" && $4 == "sdfg" {$4 = "XXXX"} {print}'

1
तेज! .. इसकी तुलना, 1 मिलियन लाइनों के लिए, Birei के awk और रश की स्थिति सेड के साथ : 0m1.580s बनाम 0m3.792s बनाम 0m6.740s
Peter.O

1

का उपयोग कर GNU awk:

awk '
    BEGIN { IGNORECASE = 1 } 
    /^select asdf/ { 
        sub( /\<sdfg\>/, "XXXX", $0 ) 
    } 
    { print }
' infile

आउटपुट:

Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg

अद्यतन : IGNORECASEगैर-जीएनयू से बचें awk, और केस-संवेदी मिलान करें। Jw013 को धन्यवाद , जिन्होंने उस विवरण पर ध्यान दिया:

awk ' 
    /^Select ASDF/ { 
        sub( /\<sdfg\>/, "XXXX", $0 ) 
    } 
    { print }
' infile

1
आपको IGNORECASEएक GNU awk/ gawkएक्सटेंशन का उल्लेख करना चाहिए ।
jw013

1
@ jw013: धन्यवाद। आपके सुझाव के साथ अपडेट किया गया उत्तर।
बीरी

4
इस मामले में IGNORECASE गलत है, चाहे वह GNU हो या G'not .. सवाल में कसौटी ऊपरी मामले के लिए स्पष्ट रूप से हैASDF
पीटर।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.