पाठ फ़ाइल से बैकस्लैश निकालें


10

मेरे पास है

इनपुट:

 NISHA =\455  

आउटपुट:

 NISHA = 455

मैं \आउटपुट से हटाना चाहता हूं । मैंने कमांड का उपयोग करने की कोशिश की, sed "s/[\]//g" Pलेकिन यह काम नहीं कर रहा है और यह एक त्रुटि को चिह्नित करता है:

character found after backslash is not meaningful

3
आपको लगता है कि sed(या संभवत: आप उस आदेश को गैर- POSIX शेल से चला रहे हैं) का गैर-POSIX कार्यान्वयन हो सकता है)। sedहालांकि आपको ज़रूरत नहीं है , trपर्याप्त है tr -d '\\' < P:।
स्टीफन चेजलस

जवाबों:


20

उदाहरण के परिणाम में दिखाए गए अनुसार आप बैकस्लैश को किसी स्थान से बदल सकते हैं:

sed 's/\\/ /g'

या आप इसे अपने कोड में दिखाए अनुसार हटा सकते हैं:

sed 's/\\//g'

विशेष वर्ण

इसके विशेष अर्थ को रद्द करने के लिए बैकस्लैश से बचने के साथ संभावित समस्याएं हैं। बैकस्लैश एक विशेष चरित्र है जिसका उपयोग शेल में और नियमित अभिव्यक्ति दोनों में भागने के लिए किया जाता है।

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

  1. एक regex में (जैसे आदेशों के लिए इनपुट sed, grepआदि) बैकस्लैश इस तरह बैकस्लैश होना कर सकते हैं: \\और भी आप सेट अभिव्यक्ति का उपयोग कर सकते [\]है जैसे आप क्योंकि वहाँ बैकस्लैश अपनी विशेष अर्थ खो देता है इस्तेमाल किया।

  2. एक शेल (जैसे bash) में आप बैकस्लैश द्वारा बैकस्लैश से बच सकते हैं। इसलिए \लिखने के बजाय \\। दोहरे उद्धरण चिह्नों के बीच स्ट्रिंग संलग्न करने "से बैकस्लैश व्यवहार अधिक जटिल हो जाता है <1> लेकिन डबल बैकस्लैश अभी भी एक सिंगल बैकलैश उत्पन्न करेगा। एकल उद्धरणों के बीच स्ट्रिंग 'को शामिल करने से हर पात्र का शाब्दिक रूप से इलाज किया जा सकता है '

आप उपयोग करना चाहते हैं डबल कोट्स :, आप निम्न में से एक का उपयोग कर सकते
sed "s/\\\\//g"एस्केप - \द्वारा \खोल में, और हर बचने \फिर regex में। वास्तव में इस मामले में दोहरे उद्धरण आवश्यक नहीं हैं क्योंकि प्रत्येक विशेष वर्ण ठीक से बच गया है।
sed "s/[\\]//g"- एक बैकलैश द्वारा शेल में भाग लें \और रेगेक्स में एक सेट का उपयोग करें [ ]
sed "s/[\]//g"- हाँ, आपका उदाहरण POSIX आज्ञाकारी वातावरण में काम करना चाहिए! दोहरे उद्धरण चिह्नों के बीच में \जब तक कि यह दोहरे उद्धरणों के संदर्भ में एक विशेष चरित्र को प्रस्तुत नहीं करता है: $`"\या एक नई पंक्ति। ऐसा लगता है कि आपके मामले में शेल या तो sedPOSIX मानक का पालन नहीं करता है।

सिंगल कोट्स के साथ आप स्ट्रिंग का उपयोग भी कर सकते हैं जैसा आपने इस्तेमाल किया था या इससे भी छोटा तरीका:
sed 's/[\]//g'
sed 's/\\//g'


6

आपको बैकस्लैश से बचना होगा। इसे इस्तेमाल करे:

sed 's/\\//g'

3

यदि आप sed समाधान नहीं चाहते हैं, तो निम्न आदेशों के साथ प्रयास करें:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11


1
sed 's/\\//'

\पहले की \तरह रखें जैसे आप सबसे विशेष पात्रों के साथ करते हैं।


आपने gअज्ञात कारण के लिए ध्वज को छोड़ दिया है । यह कमांड के व्यवहार को बदल देता है लेकिन इस तरह के बदलाव को प्रश्न में नहीं पूछा गया था। अन्यथा आपका उत्तर पहले के उत्तरों की तुलना में कुछ नया नहीं लाता है।
पाबौक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.