एम्परसेंड और () के साथ sed का उपयोग करना


19

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

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas

जब भी मैं इस कमांड को चलाता हूं तो यह मूल पाठ के साथ सभी प्रकार के फंकी सामान को जोड़ने और करने के लिए लगता है।

प्रश्न: मैं ऐसे पाठ को कैसे बदलूं जिसमें एम्परसेंड में sed कमांड हो।


6
&एक विशेष चरित्र है, इसलिए इसे RHS में उपयोग किए जाने से बचने की आवश्यकता होती है - आपके मामले में आपको दौड़ना होगा, 's/user=&uid./user=\&sysuserid./g'हालांकि मुझे संदेह है कि आपको शाब्दिक बिंदु से मेल खाने के लिए LHS में डॉट से बचने की आवश्यकता है, इसलिए आपको वास्तव में ज़रूरत है's/user=&uid\./user=\&sysuserid./g'
don_crisst

1
हां, दाईं ओर 'और' का अर्थ मूल रूप से "सब कुछ जो बाईं ओर से मेल खाता है" है, इसलिए इसे '\' से बचकर निकलें। आपको केवल एक टिप्पणी के बजाय इसका उत्तर देना चाहिए।
एडवर्ड फॉक

मैं पहली अवधि से बचने के लिए नहीं था ... बस किसी और में एक सिर उत्सुक था :)
lucasdavis500

जवाबों:


25

&प्रतिस्थापन पाठ में विशेष है: इसका मतलब है "इनपुट का पूरा हिस्सा जो पैटर्न से मेल खाता था", इसलिए आप यहां क्या कर रहे हैं, इसके user=&uidXसाथ उत्तर दें user=user=&uidXsysuserid.। प्रतिस्थापन पाठ में एक वास्तविक एम्परसेंड सम्मिलित करने के लिए, का उपयोग करें \&

एक और चीज जो गलत दिखती है वह यह है कि .खोज पैटर्न किसी भी वर्ण (एक नई रेखा को छोड़कर) के लिए खड़ा है, लेकिन .प्रतिस्थापन पाठ के अंत में एक शाब्दिक बिंदु है। यदि आप केवल शाब्दिक स्ट्रिंग को बदलना चाहते हैं user=&uid., तो .बैकस्लैश के साथ सुरक्षा करें ।

sed -e 's/user=&uid\./user=\&sysuserid./g'

यदि आप किसी एक वर्ण को बदलना चाहते हैं और उसे परिणाम में संरक्षित करना चाहते हैं, तो \1उस समूह को संदर्भित करने के लिए चरित्र को एक समूह में रखें और प्रतिस्थापन में उपयोग करें ।

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'

वास्तव में, मूल पाठ और प्रतिस्थापन के बीच दोहराव को देखते हुए, आपको वैसे भी समूहों का उपयोग करना चाहिए:

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'

यानी "की जगह uद्वारा sysuserके बीच user=&और id."।


क्या आप समूहों की व्याख्या कर सकते हैं?
लुकासदविस 500

2
@ lucasdavis500 एक समूह पैटर्न के एक भाग की पहचान करता है। इसे बैकस्लैश-कोष्ठकों द्वारा सीमांकित किया गया है। उदाहरण के लिए \(user=&\)एक पैटर्न है जो user&मैच स्ट्रिंग को एक समूह (समूह संख्या 1 के रूप में संग्रहीत करता है क्योंकि यह पैटर्न में पहला समूह है)। फिर प्रतिस्थापन \1में समूह संख्या 1 के लिए संग्रहीत स्ट्रिंग द्वारा प्रतिस्थापित किया जाता है
गिल्स एसओ- बुराई को रोकें '

क्या आपका मतलब है (यूजर = &) स्टोर यूजर = &, न कि यूजर &?
लुकासडाविस 500

@ lucasdavis500 मुझे आपकी टिप्पणी समझ नहीं आ रही है। =नियमित अभिव्यक्तियों और प्रतिस्थापन पाठ में वर्ण स्वयं के लिए खड़ा होता है, इसलिए user=&केवल मेल खाता है user=&, और user=&रिप्लेसमेंट पाठ पैदावार user=में रेगेक्स द्वारा मिलान की गई पंक्ति के भाग के बाद होता है।
गिल्स 'SO- बुराई होना बंद करो'

1
@ lucasdavis500 =चरित्र का कोई विशेष अर्थ नहीं है। user=&प्रतिस्थापन पाठ user=में मूल मिलान पाठ के बाद उत्पादन होता है। user=\&प्रतिस्थापन पाठ में उत्पादन होता हैuser=&
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.