कैसे sed एक क्षेत्र में पैटर्न पा सकते हैं लेकिन दूसरे को जोड़ सकते हैं (एक ही पंक्ति)


2

मेरे पास एक पाठ फ़ाइल है जिसमें अल्पविराम से अलग किए गए मान हैं। फ़ील्ड 1 में फ़ील्ड है जिसका मिलान करने की आवश्यकता है, लेकिन फ़ील्ड को मैच के आधार पर प्रतिस्थापन की आवश्यकता है।

उदाहरण:

ए, सी
बी, सी

परिणाम:
ए, डी
बी, सी

मुझे लगता है कि कमांड कम या ज्यादा दिखेगी:

sed 's/A/D/'

धन्यवाद


क्या हुआ जब आपने इसे आज़माया?
ग्लेन जैकमैन

@glennjackman यार, यदि आप 's / A / D /' की कोशिश करते हैं, तो यह स्पष्ट रूप से वह नहीं करता है जो वह चाहता है। वह जानता है कि उसने सोचा था कि समाधान उस सामान्य विचार पर आधारित होगा। और वह सही है .. मैं कहूंगा कि ए को डी के साथ बदलें, ए की जगह, ए, ब्ला को ए, ब्ल से। इसलिए पहले भाग का मिलान करें और प्रतिस्थापन के दोनों भागों का उल्लेख करें, जैसा कि पहले भाग को छोड़कर, और दूसरे भाग को अलग बनाते हैं।
बारलोप

जवाबों:


0

इस बारे में कैसा है

$ echo A,fgfdgd|sed -r 's/A,[^,]*/A,D/'
A,D

यदि पहला कॉलम ए है, और फिर एक अल्पविराम है, और दूसरे कॉलम में जो कुछ भी है, वह ए, डी के साथ बहुत कुछ बदलता है। यह केवल तभी होगा जब यह पहले कॉलम में A से मेल खाता है (इसके बाद अल्पविराम और जो भी दूसरे कॉलम में है)।

एक फ़ाइल के साथ एक उदाहरण

यह आपके उदाहरण को आपके परिणाम में बदल देता है। तो, जहां आपका पहला कॉलम A है, वहीं आपका दूसरा कॉलम D बनता है।

$ cat a.b
A,C
B,C


$ sed -r 's/A,[^,]*/A,D/' a.b
A,D
B,C


$

1

उन पंक्तियों का चयन करने के लिए एक पता अभिव्यक्ति का उपयोग करें जिन्हें आप संपादित करना चाहते हैं, फिर वास्तव में प्रतिस्थापन करने के लिए एक नियमित प्रतिस्थापन का उपयोग करें। Sed के बारे में एक मजेदार बात यह है कि, "s" कमांड से पहले, आप उन रेखाओं को चुनने के लिए एक पंक्ति संख्या या एक नियमित अभिव्यक्ति निर्दिष्ट कर सकते हैं (पता भी अल्पविराम द्वारा अलग किया गया प्रारंभ और अंत हो सकता है जो सभी पंक्तियों को निर्दिष्ट करता है "पता श्रेणी" के भीतर निहित है, लेकिन दूसरे भाग को छोड़कर एकल लाइनों का चयन करता है)।

अपने पते की अभिव्यक्ति में, "एक अल्पविराम नहीं, जो आप चाहते हैं उसके बाद देखें"।

प्रतिस्थापन में, अपने पैटर्न से पहले सामान को याद रखें, फिर अपने प्रतिस्थापन स्ट्रिंग से पहले "पहले" भागों को रखें। आपको "पहले" भाग याद है क्योंकि आप पहले वाले सामान को केवल एक अल्पविराम में शामिल करना चाहते हैं, इससे अधिक और कम नहीं। यहाँ यह दिखा रहा है कि यह पहले क्षेत्र से मेल खाता है और केवल दूसरे को प्रभावित करता है; मैं "ला" को "moo" के साथ लाइनों के दूसरे कॉलम में बदल रहा हूं जो पहले कॉलम में "atter" से मेल खाता है।

$ echo -e "pattern,blah,aaa\npattern,bleh,stuff" | sed '/[^,]*atter/s/\(^[^,]*,[^,]*\)la/\1moo/g'
pattern,bmooh,aaa
pattern,bleh,stuff

यह अकेले खेतों में बच गए अल्पविरामों के साथ सही काम नहीं करेगा, इसलिए उम्मीद है कि आपकी सीएसवी फ़ाइल सरल है। :)


आप अपनी पहली पंक्ति में "ए रेंज एक्सप्रेशन का उपयोग करें" कहते हैं लेकिन क्या आपने? मुझे लगता है कि एक सीमा अभिव्यक्ति दो पते अल्पविराम से अलग होती है। एक पता रेगेक्स का रूप ले सकता है, लेकिन इसके लिए एक सीमा होगी मुझे लगता है कि इसके लिए दो पते होने चाहिए जैसे '/ regexp /, / regexp / s / a / b'
barlop

यह एक एकल पते के रूप में व्यक्त की गई "एड्रेस रेंज" है - जो यकीनन बहुत कम दूरी की सीमा है। मैंने अस्पष्ट शब्दावली का उपयोग किया, और उस पर वापस जाने के बाद इसे ठीक करना भूल गया। :) यह अब संपादित किया गया है।
dannysauer

सीड मैनुअल में देखते हुए, शब्द "पता अभिव्यक्ति" (जो आपने अपने अंतिम संपादन में उपयोग किया था) मौजूद नहीं है। एक पता है, और एक पता सीमा है। आपने एक पते का उपयोग किया, हालाँकि जैसा कि आप अपने संपादन में कहते हैं, एक 'पता श्रेणी' का उपयोग किया जा सकता है। अपनी टिप्पणी में आप लिखते हैं 'यह एक "पता श्रेणी" है जो एकल पते के रूप में व्यक्त की जाती है' मुझे नहीं लगता कि यह सही शब्दावली है। मैनुअल को देखते हुए, मुझे नहीं लगता कि एक पते को एक सीमा कहा जा रहा है। एक सीमा में दो पते होने चाहिए।
बारलोप

वाक्यांश "पता अभिव्यक्ति" एक नियमित अभिव्यक्ति द्वारा परिभाषित पते का उल्लेख है। चलाने की कोशिश करें sed '/barlow'और त्रुटि संदेश देखें; यह "एड्रेस रेगेक्सप" कहता है, जो "एड्रेस रेगुलर एक्सप्रेशन" के लिए शॉर्टहैंड है।
dannysauer

एक सीमा के संबंध में, sed प्रलेखन में एक एकल पते को "सिंगलटन" कहा जाता है। एक "सिंगलटन" एक तत्व के साथ एक सेट है। इस प्रकार पता 0, 1, या 2 sed -n '1,1'p behaves the same as की कार्डिनैलिटी के साथ एक टपल है। एक सीमा के लिए दो अलग-अलग पते ( sed -n '1p'`) की आवश्यकता नहीं होती है , इसलिए सिंगलटन मामले को सिंटैक्टिक शॉर्टहैंड मान लेना उचित लगता है एक सीमा जहां प्रारंभ और अंत बिंदु समान हैं। यह कैसे स्रोत में match_address_p द्वारा कार्यान्वित किया जाता है।
dannysauer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.