Yanıtlar:
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/^@//g
da 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 ^@
.
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
Bu aslında benim için vim içinde çalıştı:
:%s/\%x00//g
<Ctrl-V><Ctrl-2>
(hem de bir tane <Ctrl-Shift-2>
) çalışmak için alamadım , ama bu çalıştı.
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.
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 vim
BOM 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, dos
bö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
Kabul edilen çözüm benim için işe yaramadı. Bunun tr
yerine 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'
^@
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
@ 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, fileencodings
seç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 fileencodings
eşleşemeyeceği anlamına da gelirse ), dosyayı encoding
seçeneklerde belirtilen karakter kodlamasıyla okuyun . İçin varsayılan karakter kodlama encoding
seçeneği geçerli: latin1
. Şimdi, çünkü latin1
olan bir byte uzunluğu karakter kodlaması, bütün dosyadaki bayt geçerlidir latin1
karakterler (hatta Nul
karakter ^@
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).