Bu sembol “^ @” vim ile nasıl kaldırılır?


59

Bu sembolle bozulmuş bazı dosyalarım var:

^ @

Dizenin bir parçası değil; aranabilir değil. Bu sembolü hiçbir şeyle nasıl değiştiririm veya bu sembolü nasıl silerim?

İşte bir dosyadan örnek bir satır:

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

Yanıtlar:


51

Deneyebilirsin:

  • %s/<CTRL-2>//g (normal PC'lerde)

  • %s/<CTRL-SHIFT-2>//g (Mac PC'lerde)

burada <CTRL-2>ilk önce CTRLnormal PC'lerde bastırmak, basılı tutmak, vurmak 2, serbest bırakmak demektir CTRL.

ve <CTRL-SHIFT-2>ilk önce controlMac PC'lere bastırmak, basılı tutmak shift, Mac PC'lere bastırmak, basılı tutmak, vurmak 2, serbest bırakmak controlve basmak anlamına gelir shift.

Son olarak, her iki komutun %s/^@//gda ekranda sonuçlanması gerekir . ^@tek bir karakter (aksi takdirde görüntülenemeyen bir NULL bayt) anlamına gelir, ^takip etmez @, bu nedenle yukarıdaki komutta sadece ^ve @bir satırda yazamazsınız.

Bu komut hepsini kaldırır ^@.


4
Sadece bu soruya / cevabınıza ilgili bir link aracılığıyla tökezledi: Bu aslında kötü bir tavsiye ve sadece çok az durumda düzgün çalışacak. Boş baytları silmek yerine kodlamayı değiştirmek daha iyidir. Boş baytları kaldırırsanız, yine de çöp gibi görünen diğer çok baytlık karakterleriniz olabilir.
Mario

@ Macario bize kodlama değişikliği hakkında daha fazla bilgi verebilir misiniz? Jrb'nin aşağıdaki cevabı ile ilgili bir şey mi var?
George

Aşağıda rpyzh'in cevabına bakınız. Dosyayı doğru kodlamayı kullanarak ve farklı bir dosyaya kaydederek yüklemeyi gösterir (cevabın biraz daha açıklamaya ihtiyacı olsa da). Jrb'nin son notu sadece okumak istiyorsanız yeterlidir, ancak başka bir kodlama kullanarak boş baytlar olmadan kaydedilmesini istemiyorsanız yeterli değildir.
Mario

50

Dosyalarının bozuk olduğunu sanmıyorum. Örnek satırınız, her karakter arasında boş bayt bulunan normal metin içeriyor gibi görünüyor. Bu, UTF-16'da kodlanmış bir metin dosyası olduğunu ancak dosyanın başlangıcında bayt sıra işaretinin eksik olduğunu gösterir. Bkz http://en.wikipedia.org/wiki/Byte-order_mark

Diyelim ki Not Defteri'ni açtım, 'dosyaadı' kelimesini yazın ve Unicode Big-endian olarak kaydedin. Bu dosyanın onaltılık bir dökümü şöyle görünür:

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

Bu dosyayı Vim'de açarsam iyi görünüyor - 'fe ff' bayt Vim'e dosyanın nasıl kodlandığını söyler. Şimdi aynı bayt sırasını içeren bir dosya oluşturduğumu varsayalım, fakat baştaki 'fe ff' olmadan. Vim, boş baytların yerine ^ @ (veya <00>, yapılandırmanıza bağlı olarak) ekler; Not Defteri boşluk ekler.

Bu nedenle, boşları kaldırmak yerine, Vim'i dosyayı doğru şekilde yorumlayabilmeyi düşünmelisiniz. Vim'i, dosyayı aşağıdaki komutla doğru kodlamayla yeniden yüklemek için alabilirsiniz:

:e ++enc=utf16


Evet, son komut vim'in yaptığı dosyayı doğru yorumluyor, ancak boş olanları kaldırmıyor.
mrt181

6
Onları kaldırmak için başka bir kodlama seçin ve dosyayı tekrar kaydedin:: set fenc = utf-8
scy

35

Bu aslında benim için vim içinde çalıştı:

:%s/\%x00//g

5
bu substitute () ile çalışır, ancak Ctl-VCtl-Shift-2 çalışmaz.
dsummersl

Benim için aynı problem, ben de <Ctrl-V><Ctrl-2>(hem de bir tane <Ctrl-Shift-2>) çalışmak için alamadım , ama bu çalıştı.
Jeff Bridgman

5
Bu benim için çalışıyor linux. '00' komutu modunda (ASCII olsun" düşünmek) ya da imleci üzerine yerleştirerek ve 'ga' yazarak vim Herhangi bir karakteri bulmak için ASCII hex değeridir. Komut satırında ASCII: / olarak vim .wikia.com / wiki /…
Casey Jones

^ Vx00 da çalışır. ^ VuXXXX ile 16 bitlik unicode da girebilirsiniz. Bir aramada \% uXXXX 'ı denedim ve bu da işe yaradı.
Edward Falk

Zamanın sonuna kadar benim sevgili erkeğim olacaksın. Kalbimin derinliklerinden ... teşekkür ederim!
Gonzalo Cao

12

Bu 'sembol' ASCII değeri 000 olan bir NULL karakterini temsil eder.

Vim ile kaldırmak zor, denemek

tr -d '\000' < file1 > file2

7

Diğerlerinin de belirttiği gibi, bunlar boş byte'lardır (ASCII 00). Linux'ta ASCII değerlerini vim'e girmenin yolu Ctrl-V ve ardından herhangi bir karakterin 3 basamaklı sekizlik değerine basmaktır. Tüm boş baytları değiştirmek için şunu kullanın:

    :%s/Ctrl-V000//g

(boşluksuz).

Aynı şekilde, null'ları aşağıdakilerle de arayabilirsiniz:

    /Ctrl-V000

Her iki durumda da, yazarken sıfırları göstermez, ancak üçüne de girdikten sonra görüntülenir ^@. Renkli terminallerde bunun bir kontrol karakteri olduğunu belirtmek için mavi renkte gösterilecektir.


6

FWIW, benim durumumda, bir mac'ta oluşturulan bir metin dosyasını düzenlemek için cygwin'deki vim kullanmak zorunda kaldım. Kabul edilen çözüm benim için işe yaramadı, ama yakındı. Unicode ile çalışma hakkındaki Vim wiki sayfasına göre , BOM baytının Büyük Endian ve Küçük Endian sürümleri arasında bir fark var. Bu yüzden açıkça vimBOM kodlamanın Little Endian sürümünü kullanmam gerektiğini söylemek zorunda kaldım .

Yalnızca doğru kodlamayı seçtikten sonra, dosya biçimini (satır sonları) dönüştürdüm, dosböylece dosyayı Windows editöründe düzenleyebildim. Kodlamayı belirtmeden önce dosya formatını sıfırlamayı denemek bana acı verdi. İşte kullandığım komutların tam listesi:

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

Değerli bilgi Benim durumumda malzeme listesi baytının endianness oldu.
Andre Albuquerque

3

Kabul edilen çözüm benim için işe yaramadı. Bunun tryerine dosyayı vim piposuyla yaptım :

:%!tr -d '\000'

Bu aynı zamanda görsel modla (sadece yazın :!tr -d '\000') veya bir dizi çizgiyle de işe yarar:

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

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

2

^@ uygun bir kodlama kullanıyorsanız, kötü bir karakter değil, ancak kaldırmak isterseniz deneyin:

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

^ M karakteri, örnek verilerinizde var

Herhangi bir işlemden önce dosyanızı Unix / Linux formatına dönüştürmek için şunu deneyin:

dos2unix filename - rhel ve diğer

dos2ux filename [newfilename] - HP-UX


1

@ Jrb'nin cevabına ek olarak, Vim'de, dosyanın karakter kodlaması fileencodings seçeneğine göre tespit edilir. (dosya kodlarının sonunda 's' ye dikkat edin)

Örneğin, Windows'ta, fileencodingsseçenek için varsayılan değer şudur ucs-bom:

BOM dosyasının dosya başında olup olmadığını kontrol edin.

BOM varsa, 'dosyanın BOM dışındaki karakter kodlamasını okuyun'.

BOM mevcut değilse (ve bu durumda, seçenekde belirtilen tüm karakter kodlamalarının fileencodingseşleşemeyeceği anlamına da gelirse ), dosyayı encodingseçeneklerde belirtilen karakter kodlamasıyla okuyun . İçin varsayılan karakter kodlama encodingseçeneği geçerli: latin1. Şimdi, çünkü latin1olan bir byte uzunluğu karakter kodlaması, bütün dosyadaki bayt geçerlidir latin1karakterler (hatta Nulkarakter ^@size * görüyoruz).

* - aslında, ^@Vul'un tampon metnindeki yeni satır, Nul karakterinden değil.

Dosyayı okumanın doğru yolu, karakter kodlamasını manuel olarak UTF-16 olarak belirtmektir (UTF-16 gibi gözüktüğü gibi, bu durumda uygun karakter kodlamasıdır).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.