मैं sed का उपयोग करके U + 200B (शून्य-चौड़ाई स्थान) को कैसे हटा सकता हूं


15

मेरे पास एक बहुत बड़ी फाइल है जिसमें शून्य-चौड़ाई वाले रिक्त स्थान पूरे बिखरे हुए हैं। इसे खोलने और संपादित करने में बहुत लंबा समय लगता है viइसलिए मैं उपयोग करने वाले चरित्र के सभी उदाहरणों को हटाना चाहता हूं sed। समस्या यह है, मैं यह पता नहीं लगा सकता कि चरित्र का मिलान कैसे किया जाए! मैं का उपयोग कर की कोशिश की है \u200B, \x{200b}। कोई विचार?

मैं CentOS 5 चला रहा हूँ अगर वह बिल्कुल मदद करता है।


क्या आपकी फ़ाइल की एन्कोडेड यूनिकोड एन्कोडिंग का समर्थन करता है? यदि नहीं तो शायद इसे
सेड के

@ जैन - वास्तव में, मैं अजगर के साथ गया हूँ। फ़ाइल utf8 के साथ एन्कोडेड है, पर्याप्त मानक लगता है कि कुछ भी इसे संसाधित करने में सक्षम होना चाहिए। मैंने अपनी पाइथन लिपि को नीचे जोड़ दिया है, किसी के लिए भी उपयोगी है।
थीटाको

जवाबों:


11

यह मेरे लिए काम करने लगता है:

sed 's/\xe2\x80\x8b//g' inputfile

प्रदर्शन:

$ /usr/bin/printf 'X\u200bY\u200bZ' | hexdump -C
00000000  58 e2 80 8b 59 e2 80 8b  5a                       |X...Y...Z|
$ /usr/bin/printf 'X\u200bY\u200bZ' | sed 's/\xe2\x80\x8b//g' | hexdump -C
00000000  58 59 5a                                          |XYZ|

संपादित करें:

आंशिक रूप से गिल्स के उत्तर पर आधारित:

tr -d $(/usr/bin/printf "\u200b") < inputfile

बिल्कुल सही - यह वही है जो मैं देख रहा था। वास्तव में, मैंने देखा कि \xe2\x80\x8bपायथन में कुछ सैंपल स्ट्रिंग्स को देखते हुए पात्रों का एक ही सेट ( )। धन्यवाद!
थीटाका

4

UTU-8 के साथ GNU sed का व्यवहार बहुत अच्छी तरह से परिभाषित नहीं लगता है। प्रयोगात्मक रूप से, आप इसे UTF-8 प्रतिनिधित्व के बाइट्स को बदल सकते हैं:

<old sed 's/\xe2\x80\e8b//g' >new

वैकल्पिक रूप से, आप वर्ण को अपने शेल में टाइप कर सकते हैं और UTF-8 लोकेल में किसी भी मानक कमांड का उपयोग कर सकते हैं:

<old tr -d '​' >new
<old sed 's/​//g' >new

Zsh में, आप एक एस्केप सीक्वेंस के माध्यम से भी चरित्र दर्ज कर सकते हैं:

<old tr -d $'\u200B' >new

बैश 4.2 के रूप में, यूनिकोड दृश्यों के द्वारा समर्थित हैं echo -e, printfप्रारूप तार और एएनएसआई उद्धृत तार (जैसे echo -e '\u1E4F', printf '\u01DD %s\n' 'X', mkdir $'\u0250)
रुका हुआ अगली सूचना तक।

0

ठीक है, जब तक किसी को यह करने के लिए कोई विचार sedनहीं है (जो कि मैं अब भी दिलचस्पी रखता हूं, वैसे) बचाव के लिए इसका पायथन ...

import sys, re
pattern = re.compile(u"\u200b")
f = open(sys.stdin, "rb")
for line in f:
    a = pattern.sub("", line.decode("utf8"))
    print a.encode("utf8"),
f.close()

2
यदि आप बड़ी तोपों के लिए पहुंचने जा रहे हैं, तो कितना सरल है perl -C -pe 's/\x{200B}//g'?
गाइल्स का SO- बुराई पर रोक '22

+1 गाइल्स जो मैक OSX पर भी काम करता है। perl -C -pi.bak -e 's/\x{200B}//g' yourfileआपके निर्धारित परिणाम और yourfile.bak में एक बैकअप
MarkHu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.