विम के साथ इस प्रतीक "^ @" को कैसे निकालें?


59

मेरे पास कुछ फाइलें हैं जो इस प्रतीक से दूषित हैं:

^ @

यह स्ट्रिंग का हिस्सा नहीं है; यह खोज योग्य नहीं है। मैं इस प्रतीक को कुछ नहीं के साथ कैसे प्रतिस्थापित करूं, या मैं इस प्रतीक को कैसे हटाऊं?

यहाँ एक फ़ाइल से एक उदाहरण पंक्ति है:

^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@

जवाबों:


51

तुम कोशिश कर सकते हो:

  • %s/<CTRL-2>//g (नियमित पीसी पर)

  • %s/<CTRL-SHIFT-2>//g (मैक पीसी पर)

जहां <CTRL-2>इसका मतलब है कि पहले CTRLनियमित पीसी पर प्रेस करें , इसे नीचे दबाए रखें, हिट करें 2, जारी करें CTRL

और <CTRL-SHIFT-2>इसका मतलब है कि पहले controlमैक पीसी पर प्रेस करें , इसे नीचे दबाए रखें, shiftमैक पीसी पर दबाएं , इसे नीचे दबाए रखें, हिट करें 2, रिलीज करें controlऔर shift

अंत में, दोनों आदेशों का परिणाम %s/^@//gस्क्रीन पर होना चाहिए । ^@एक एकल चरित्र (एक NULL बाइट, जिसे अन्यथा प्रदर्शित नहीं किया जा सकता है) का अर्थ है, ^उसके बाद नहीं @, इसलिए आप उपरोक्त कमांड में केवल एक पंक्ति ^और @पंक्ति में टाइप नहीं कर सकते ।

यह कमांड सभी को हटा देता है ^@


4
संबंधित लिंक के माध्यम से बस इस सवाल / जवाब पर ठोकर खाई: यह वास्तव में एक बुरी सलाह है और बहुत कम मामलों में ही ठीक से काम करेगा। नल बाइट्स को हटाने के बजाय एन्कोडिंग को वास्तव में बदलना बेहतर है। यदि आप अशक्त बाइट्स निकालते हैं, तो आपके पास अभी भी अन्य मल्टीबाइट वर्ण हो सकते हैं जो कचरा दिखाते हैं।
मारियो

@Mario आप एन्कोडिंग परिवर्तन के बारे में अधिक बता सकते हैं? क्या यह नीचे दिए गए jrb के उत्तर से संबंधित है?
जॉर्ज

Rpyzh का उत्तर नीचे और नीचे देखें। फ़ाइल को उचित एन्कोडिंग का उपयोग करके लोड करने के साथ-साथ एक अलग से सहेजना दिखाता है (हालाँकि उत्तर में कुछ और स्पष्टीकरण की आवश्यकता हो सकती है)। Jrb का आखिरी नोट पर्याप्त है यदि आप इसे पढ़ना चाहते हैं, लेकिन नहीं, अगर आप इसे किसी अन्य एन्कोडिंग का उपयोग करके शून्य बाइट्स के बिना सहेजना चाहते हैं।
मारियो

50

मुझे नहीं लगता कि आपकी फाइलें दूषित हैं। आपकी उदाहरण पंक्ति में ऐसा लगता है कि इसमें प्रत्येक वर्ण के बीच अशक्त बाइट्स के साथ नियमित पाठ है। इससे पता चलता है कि यह एक टेक्स्ट फाइल है जिसे UTF-16 में एनकोड किया गया है लेकिन बाइट-ऑर्डर मार्क फाइल के शुरू होने से गायब है। Http://en.wikipedia.org/wiki/Byte-order_mark देखें

मान लीजिए कि मैंने नोटपैड खोला, 'फ़ाइलनाम' शब्द टाइप करें, और यूनिकोड बिग-एंडियन के रूप में सहेजें। इस फ़ाइल का हेक्स डंप इस तरह दिखता है:

fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65

अगर मैं इस फाइल को Vim में खोलता हूँ तो यह ठीक लगता है - 'fe ff' बाइट्स Vim को बताता है कि फाइल कैसे एनकोडेड है। अब मान लीजिए कि मैं बाइट्स के सटीक समान अनुक्रम वाली एक फ़ाइल बनाता हूं, लेकिन प्रमुख 'fe ff' के बिना। नल बाइट्स के स्थान पर विम @ ^ (या <00>, आपके कॉन्फ़िगरेशन के आधार पर) सम्मिलित करता है; नोटपैड रिक्त स्थान सम्मिलित करता है।

तो नल को हटाने के बजाय, आपको फ़ाइल को सही ढंग से व्याख्या करने के लिए वास्तव में विम की तलाश में होना चाहिए। आप कमांड के साथ सही एन्कोडिंग के साथ फ़ाइल को फिर से लोड करने के लिए विम प्राप्त कर सकते हैं:

:e ++enc=utf16


हां, अंतिम कमांड ने फ़ाइल को सही ढंग से व्याख्या किया है लेकिन नलबीट को नहीं हटाया है।
mrt181

6
उन्हें हटाने के लिए, एक और एन्कोडिंग चुनें और फ़ाइल को फिर से सहेजें:: fenc = utf-8
scy

35

यह वास्तव में मेरे लिए काम कर रहा है:

:%s/\%x00//g

5
यह विकल्प () के साथ काम करता है, लेकिन Ctl-VCtl-Shift-2 नहीं करता है।
dsummersl

मेरे लिए भी यही समस्या है, मैं <Ctrl-V><Ctrl-2>( <Ctrl-Shift-2>या साथ ही साथ ) काम नहीं कर सका , लेकिन यह काम किया।
जेफ ब्रिजमैन

5
यह मेरे लिए लिनक्स का काम करता है। '00' ASCII हेक्स मान है, जिसे आप कर्सर के ऊपर रखकर और 'g' (सोचें "ascii) कमांड मोड में या: as /: ascii कमांड लाइन पर टाइप करके किसी भी वर्ण के लिए खोज सकते हैं। vim .wikia.com / wiki /…
केसी जोन्स

^ Vx00 भी काम करता है। आप ^ VuXXXX के साथ 16-बिट यूनिकोड भी दर्ज कर सकते हैं। मैंने एक खोज में \% uXXXX की कोशिश की और वह भी काम किया।
एडवर्ड फॉक

आप समय के अंत तक मेरे प्रिय व्यक्ति होंगे। मेरे दिल की गहराई से ... धन्यवाद!
गोंजालो काओ

12

वह 'प्रतीक' ASCII मान 000 के साथ एक पूर्ण वर्ण का प्रतिनिधित्व करता है।

विम के साथ निकालना मुश्किल है, कोशिश करें

tr -d '\000' < file1 > file2

7

जैसा कि अन्य ने उल्लेख किया है, वे अशक्त बाइट्स (ASCII 00) हैं। लिनक्स पर, एएससीआईआई मानों को विम में प्रवेश करने का तरीका Ctrl-V को दबाया जाता है, इसके बाद किसी भी वर्ण का 3 अंकों का अष्टाधारी मूल्य होता है। सभी अशक्त बाइट्स को बदलने के लिए, उपयोग करें:

    :%s/Ctrl-V000//g

(कोई रिक्त स्थान के साथ)।

इसी तरह, आप के साथ नल के लिए खोज कर सकते हैं:

    /Ctrl-V000

दोनों मामलों में, यह शून्य नहीं दिखाएगा जैसा कि आप उन्हें टाइप कर रहे हैं, लेकिन तीनों को दर्ज करने के बाद, यह प्रदर्शित करेगा ^@। रंग टर्मिनलों पर यह दिखाएगा कि नीले रंग में यह इंगित करने के लिए कि यह एक नियंत्रण चरित्र है।


6

FWIW, मेरे मामले में मुझे एक मैक पर बनाई गई पाठ फ़ाइल को संपादित करने के लिए cygwin पर विम का उपयोग करना पड़ा। स्वीकृत समाधान मेरे लिए काम नहीं करता था, लेकिन करीब था। यूनिकोड के साथ काम करने के बारे में विम विकी पेज के अनुसार , बीओएम बाइट के बिग एंडियन और लिटिल एंडियन संस्करणों में अंतर है। इसलिए, मुझे vimBOM एन्कोडिंग के लिटिल एंडियन संस्करण का उपयोग करने के लिए स्पष्ट रूप से बताना था ।

सही एन्कोडिंग चुनने के बाद ही मैंने फ़ाइल प्रारूप (लाइन एंडिंग) को परिवर्तित किया dosताकि मैं फ़ाइल को विंडोज एडिटर में एडिट कर सकूं। एन्कोडिंग निर्दिष्ट करने से पहले फ़ाइल प्रारूप को रीसेट करने की कोशिश ने मुझे दुःख दिया। यहां उन कमांड की पूरी सूची दी गई है जिनका मैंने उपयोग किया है:

:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq

अनमोल जानकारी। मेरे मामले में यह बीओएम बाइट की समाप्ति थी।
आंद्रे अल्बुकर्क

3

स्वीकृत समाधान मेरे काम नहीं आया। मैंने trइसके बजाय फ़ाइल को विम पाइप किया :

:%!tr -d '\000'

यह दृश्य मोड (बस प्रकार :!tr -d '\000') या लाइनों की एक श्रृंखला के साथ भी अच्छा काम करेगा :

# Remove nulls from current line:
:.!tr -d '\000'

# Remove nulls from lines 3-5:
:3,5!tr -d '\000'

2

^@ यदि आप उचित एन्कोडिंग का उपयोग करते हैं तो एक बुरा चरित्र नहीं है, लेकिन यदि आप हटाना चाहते हैं तो कोशिश करें:

  • tr -d '\000'
  • sed 's/\000//g'

^ एम चरित्र आपके उदाहरण डेटा में है

किसी भी प्रसंस्करण से पहले अपनी फ़ाइल को यूनिक्स / लिनक्स प्रारूप में बदलने के लिए, कोशिश करें:

dos2unix filename - rhel और अन्य

dos2ux filename [newfilename] - एचपी-यूएक्स


1

@ Jrb के उत्तर के अलावा, विम में, फ़ाइल के चरित्र एन्कोडिंग का पता फ़ाइलेंकोडिंग्स विकल्प के आधार पर लगाया जाता है। (फाइल के अंत में 'एस' नोट करें)

विंडोज पर Ie, fileencodingsविकल्प के लिए डिफ़ॉल्ट मान है ucs-bom, जिसका अर्थ है:

जांचें कि क्या BOM फ़ाइल की शुरुआत में मौजूद है।

यदि BOM मौजूद है, तो 'BOM से फ़ाइल के वर्ण एन्कोडिंग को पढ़ें'।

यदि BOM मौजूद नहीं है (और इस मामले में इसका मतलब यह भी होगा कि fileencodingsविकल्प में निर्दिष्ट सभी वर्ण एन्कोडिंग मिलान करने में विफल रहे), तो encodingविकल्प में निर्दिष्ट वर्ण एन्कोडिंग के साथ फ़ाइल पढ़ें । के लिए डिफ़ॉल्ट वर्ण एन्कोडिंग encodingविकल्प है: latin1। अब, क्योंकि latin1है एक बाइट लंबाई वर्ण एन्कोडिंग, सभी फ़ाइल में बाइट्स मान्य हैं latin1वर्ण (यहां तक कि Nulचरित्र ^@है कि आप देख रहे हैं *)।

* - वास्तव ^@में, विम के बफर टेक्स्ट में न्यूलाइन कैरेक्टर है, न्यूल कैरेक्टर नहीं।

फ़ाइल को पढ़ने का उचित तरीका यह है कि चरित्र एन्कोडिंग को UTF-16 के रूप में मैन्युअल रूप से निर्दिष्ट किया जाए (क्योंकि ऐसा लगता है कि UTF-16 इस मामले में उचित चार एन्कोडिंग है)।

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