फ़ाइल में उद्धरण चिह्नों को कैसे बदलें?


11

मेरे पास एक फाइल है जिसमें xml की कई लाइनें हैं। मैं फ़ाइल के कुछ हिस्सों को बदलना चाहूंगा। फ़ाइल के कुछ हिस्सों में उद्धरण चिह्न ( ") शामिल हैं जिन्हें मैं बदलना चाहूंगा। मैं उद्धरण चिह्न से बचने की कोशिश कर रहा \हूं, लेकिन मुझे नहीं लगता कि यह मेरी फाइल के परिणाम के आधार पर काम कर रहा है।

यहाँ मेरे एक सेड कमांड का उदाहरण दिया गया है:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

क्या यह है कि आप एक sed कमांड में उद्धरण चिह्नों से कैसे बच सकते हैं या मैं कुछ गलत कर रहा हूं?


2
आपके आदेश के "text"साथ बदलने के लिए सही लग रहा है 'text'। बेशक यह कुछ भी नहीं करेगा "othertext"। कुछ इनपुट लाइनें, संबंधित अवांछित आउटपुट दिखाएं, और बताएं कि आपको इसके बजाय क्या आउटपुट चाहिए।
गिलेस एसओ- बुराई को रोकना '

तो \"sed कमांड में उद्धरण चिह्नों से बचने का सही तरीका क्या है?
jbranchaud

4
Sed के लिए नहीं: sed को भागने की जरूरत नहीं है, या समर्थन नहीं है "। लेकिन आपका शेल कमांड एक डबल-उद्धृत स्ट्रिंग का उपयोग करता है, और \"वहां सही है। sedकार्यक्रम देखता है s/"text"/'text'/igकरने के लिए तर्क के रूप में -e
गिल्स एसओ- बुराई को रोकना '

@ गिल्स स्पेस के बारे में क्या कहते हैं? क्या पालक सफेद स्थानों को समझता है और उनका सम्मान करता है? उदाहरण के लिए, यदि मेरी आज्ञा समाहित है, तो s/\"text\" /'text'/igक्या यह केवल "text" उसके बाद के स्थान के साथ मिलेगा ?
jbranchaud

3
रिक्त स्थान बिल्कुल मेल खाना चाहिए। इस संवाद को जारी रखने के बजाय, मेरा सुझाव है कि आप कुछ नमूना इनपुट और संबंधित वांछित आउटपुट पोस्ट करें (और शायद समझाएं कि आपको उद्धरण बदलने की आवश्यकता क्यों है)। यह भी स्पष्ट नहीं है कि sedनौकरी के लिए सही उपकरण है, शायद आप एक XML पार्सर चाहते हैं।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


12

दो सुझाव:

  1. आप एक एकल उद्धरण के साथ उद्धृत स्ट्रिंग के भीतर एक उद्धरण से बच नहीं सकते। इसलिए आपको उद्धरण को बंद करना होगा, बची हुई बोली को जोड़ना होगा, फिर दोबारा उद्धरणों को खोलना होगा। वह है: 'foo'\''bar'जो टूट जाता है:

    • 'foo'        उद्धृत foo
    • \'             भाग निकले '
    • 'bar'        उद्धृत bar

    उपज foo'bar

  2. (वैकल्पिक) जरूरी नहीं कि /आप sed में उपयोग करें । मुझे लगता है कि उपयोग करना /और \उसी सेड एक्सप्रेशन में पढ़ना मुश्किल हो जाता है।

उदाहरण के लिए, इस फ़ाइल के उद्धरण हटाने के लिए:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

ऊपर दिए गए मेरे दो सुझावों को देखते हुए, आप डबल और सिंगल दोनों उद्धरणों को हटाने के लिए उपयोग कर सकते हैं:

$ sed -e 's|["'\'']||g'  /tmp/f

मेरी पहली टिप के आधार पर, शेल sed के दूसरे तर्क (यानी, स्ट्रिंग के बाद -e) को कम कर देता है s|["']||gऔर उस स्ट्रिंग को sed में बदल देता है। मेरे दूसरे सिरे के आधार पर, sed इस के समान ही व्यवहार करता है s/['"]//g। इसका मतलब

'या तो मिलान वाले सभी वर्णों को हटा दें "   (अर्थात, उन्हें कुछ भी नहीं बदलें)

आपको शायद इससे कुछ अधिक जटिल की आवश्यकता है कि आप क्या चाहते हैं, लेकिन यह एक शुरुआत है।


1
अपने दूसरे सिरे पर एक महीन बिंदु डालने के लिए: आप किसी भी वर्ण का उपयोग कर सकते हैं / जब एस और वाई कमांड का उपयोग करते हैं, संभवतः दूसरों के बीच। अन्य सेड कमांड के साथ रीजैक्स का उपयोग करते समय, पहले सीमांकक (यदि / के लिए एक विकल्प का उपयोग करके) बच जाना चाहिए। यदि आप इसे regexp में मेल करने का प्रयास कर रहे हैं, तो आपका पसंदीदा सीमांकक भी बच जाना चाहिए।
एली हेडी

बिना गन्दा हुए सिंगल कोट्स और डबल कोट्स को मिलाना मुश्किल है। कुछ लोगों को यह पढ़ने में आसान लगता है कि क्या आप एकल उद्धरणों को उद्धृत करते हैं, उन्हें बचने के बजाय दोहरे उद्धरणों में डालते हैं। इसलिए, इसके बजाय 'foo'\''bar', हम उपयोग कर सकते हैं 'foo'"'"'bar'
स्कॉट

1

मेरे पास यूनिक्स उपयोगिताओं का एक विंडोज पोर्ट है, इसलिए कमांड थोड़ा अलग दिखते हैं लेकिन मेरे पास कॉमा और उद्धरण चिह्नों के साथ एक सीएसवी फ़ाइल थी। एक गाइड के रूप में इस धागे का उपयोग करते हुए, मैं इस कमांड के माध्यम से उद्धरण निकालने में सक्षम था:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"

धन्यवाद! इस पर अटक गया था!
sendbits
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.