UNIX में अशक्त वर्णों को पहचानना और हटाना


98

मेरे पास एक पाठ फ़ाइल है जिसमें अवांछित अशक्त वर्ण (ASCII NUL, \0) है। जब मैं इसे देखने की कोशिश करता हूं, तो मैं सामान्य पाठ में प्रतीकों को viदेखता हूं ^@। मैं कैसे कर सकता हूँ:

  1. पहचानें कि फ़ाइल में कौन सी पंक्तियों में अशक्त अक्षर हैं? मैं \0और के लिए grepping की कोशिश की है \x0, लेकिन यह काम नहीं किया।

  2. अशक्त वर्ण हटाएं? stringsफ़ाइल पर चल रहा है इसे साफ कर दिया है, लेकिन मैं सोच रहा हूँ कि क्या यह सबसे अच्छा तरीका है?


1
इस तरह का सवाल शायद SuperUser.com का है
Olivier Lalonde

2
वास्तव में, यह सवाल superuser.com पर है: superuser.com/questions/75130/how-to-remove-ths-symbol-with-vim
jrb

जवाबों:


130

मैं उपयोग करूँगा tr:

tr < file-with-nulls -d '\000' > file-without-nulls

यदि आप सोच रहे हैं कि कमांड तर्कों के बीच में इनपुट पुनर्निर्देशन काम करता है, तो यह करता है। अधिकांश गोले समझते हैं और मैं के साथ सौदा होगा / ओ पुनर्निर्देशन ( <, >, ...) कमांड लाइन, वास्तव में कहीं।


और "फाइल-विथ-नुल्ल्स फाइल-विथ-नुल्ल्स" मुझे यह दिखाना चाहिए कि किस वर्ण में अशक्त वर्ण थे? यह उम्मीद से बहुत अधिक वापस लाता है।
dogbane

10
असल में, मेरा मानना है कि यह होना चाहिए tr -d '\000' < file-with-nulls > file-without-nullsके बाद से <खोल पाइप कार्यक्षमता का हिस्सा है और नहीं tr
मिकेल एस

9
अधिकांश गोले वास्तव में तर्क स्ट्रिंग में कहीं भी <या> के साथ पहचान और व्यवहार करेंगे। मुझे भी चकित कर दिया।
Pra

1
+1 के बजाय इनपुट पुनर्निर्देशन के उपयोग के लिए cat |। एक बढ़िया, साफ समाधान और इसने मेरी समस्या हल कर दी।
Krzysztof Jabłoński

4
@Pointy '\ 000' का प्रयोग tr के लिए POSIX opengroup विनिर्देशन में '\ 0' के बदले में किया जाता है। यह पसंद करने का एक अच्छा कारण है
हेरोल्ड फिशर

67

किसी फ़ाइल में अशक्त वर्णों को हटाने के लिए निम्न sed कमांड का उपयोग करें।

sed -i 's/\x0//g' null.txt

यदि फ़ाइल अभी भी उपयोग की जा रही है, तो यह समाधान महत्वपूर्ण रूप से फ़ाइल को संपादित करता है। pass -i'ext 'मूल फ़ाइल का बैकअप' ext 'प्रत्यय के साथ बनाता है।


6
नोट: FreeBSD में (और मेरा मानना ​​है कि मैक ओएस एक्स भी), अगले तर्क में विस्तार की sed -i आवश्यकता है, लेकिन यह खाली हो सकता है। उन प्रणालियों में, a '': as में जोड़ें sed -i '' 's/\x0//g "$FILE"
टिम Timस

1
यह trमेरे लिए की तुलना में तेजी से परिमाण का एक क्रम है
diachedelic

मेरे लिए, Windows और $ sed --version-> के लिए Git का उपयोग करके sed (GNU sed) 4.7, मुझे एक बैकअप फ़ाइल प्राप्त करने के लिए निम्नलिखित मंगलाचरण का उपयोग करना पड़ा example.csv.bak:sed -i.bak 's/\x0//g' example.csv
एंड्रयू कीटन

1
@ टिमो ने आपको बहुत अच्छा किया, बस एक चूक हो गई इसलिए इसे sed -i '' s / \ x0 // g 'some_file.xml
Darko

@ डार्को तो मैंने किया। उफ़।
टिम Čस

22

बड़ी संख्या में अवांछित एनयूएल वर्ण, हर एक बाइट को कहते हैं, यह इंगित करता है कि फ़ाइल यूटीएफ -16 में एन्कोडेड है और आपको iconvइसे यूटीएफ -8 में बदलने के लिए उपयोग करना चाहिए ।


1
जब मेरा एप्लिकेशन लॉग कर रहा था तब मैं डिस्क स्थान से बाहर भागा। इसका परिणाम इन पात्रों में हुआ।
dogbane

उदाहरण के लिए, यह इस कमांड का उपयोग करके काम करता है iconv -f UTF-16 -t UTF-8 file:।
djule5

7

मैंने निम्नलिखित की खोज की, जो बताता है कि कौन सी रेखाएं, यदि कोई हैं, में अशक्त वर्ण हैं:

perl -ne '/\000/ and print;' file-with-nulls

इसके अलावा, एक ऑक्टल डंप आपको बता सकता है कि क्या नल हैं:

od file-with-nulls | grep ' 000'

5

यदि फ़ाइल में लाइनें \ r \ n \ 000 के साथ समाप्त होती हैं, तो \ n \ 000 को हटाने के लिए क्या काम करता है, तो \ r को \ n से बदल दें।

tr -d '\n\000' <infile | tr '\r' '\n' >outfile

पुनश्च। यदि आप खुद को विंडोज डॉस शेल में पाते हैं, तो आप Sourceforge.net से यूनिक्स कमांड के GNU / win32 संस्करण प्राप्त कर सकते हैं। मुझे उन्हें हर समय इस्तेमाल करना है। "ओड" चेक करें कि फाइल में क्या है, इसका विश्लेषण करने के लिए ऑक्टल डंप कमांड ...
wwmbes

2

यहाँ उदाहरण है कि कैसे ex(जगह में) का उपयोग करके NULL वर्णों को हटाया जाए :

ex -s +"%s/\%x00//g" -cwq nulls.txt

और कई फ़ाइलों के लिए:

ex -s +'bufdo!%s/\%x00//g' -cxa *.txt

पुनरावृत्ति के लिए, आप ग्लोबिंग विकल्प का उपयोग कर सकते हैं **/*.txt(यदि यह आपके शेल द्वारा समर्थित है)।

स्क्रिप्टिंग के बाद से उपयोगी है sed और इसका -iपैरामीटर एक गैर-मानक बीएसडी विस्तार है।

यह भी देखें: फ़ाइल बाइनरी फ़ाइल है या नहीं और सभी फाइलें कैसे पढ़ें, इसकी जांच कैसे करें?


1

मैंनें इस्तेमाल किया:

recode UTF-16..UTF-8 <filename>

फ़ाइल में शून्य से छुटकारा पाने के लिए।


0

मुझे उसी त्रुटि का सामना करना पड़ा:

import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')

मैंने एन्कोडिंग को बदलकर समस्या को हल किया utf-16

f=cd.open(filePath,'r','utf-16')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.