Saya memiliki file teks utf-8 besar yang sering saya cari grep
. Baru-baru ini grep
mulai melaporkan bahwa itu adalah file biner. Saya dapat terus mencarinya grep -a
, tetapi saya bertanya-tanya perubahan apa yang membuatnya memutuskan bahwa file tersebut sekarang biner.
Saya memiliki salinan dari bulan lalu di mana file tidak lagi terdeteksi sebagai biner, tetapi tidak praktis bagi diff
mereka karena mereka berbeda pada> 20.000 baris.
file
mengidentifikasi file saya sebagai
Teks UTF-8 Unicode Bahasa Inggris, dengan garis yang sangat panjang
Bagaimana saya dapat menemukan karakter / garis / dll. di file saya yang memicu perubahan ini?
Pertanyaan serupa, non-duplikat 19907 mencakup kemungkinan NUL tetapi grep -Pc '[\x00-\x1F]'
mengatakan bahwa saya tidak memiliki NUL atau perusak kontrol ANSI lainnya.
sumber
nul
dan beberapaEsc
. Saya mencoba menangkap mereka. Saya dapat menemukanesc
s (\x1B
), tetapinul
tidak pernah muncul. Tes yang diberikan di atas menunjukkan 1, untuk baris yang berisiEsc
s, tetapi tidak ada untuk rentang apa pun yang tidak mengandung\x1B
. Saya tidak akan percaya tes itu. Cobagrep -zc .
sebagai gantinya (harus lebih dari jumlahnul
s dalam file Anda). (Juga, Anda mungkin lebih baik menggunakan[[:cntrl:]]
.)sed -z 's/.*\(....\)$/\1/' foo | od -c
untuk melihat beberapa karakter sebelumNUL
(jika ada), yang dapat membawa Anda ke masalah.sed
tidak memiliki-z
pilihan:sed: invalid option -- 'z'
.Jawaban:
Tampaknya ada karakter null dalam file. (Ditampilkan ^ @ biasanya) Saya memasukkan berbagai karakter kontrol ke file teks (seperti delete, ^ ?, misalnya), dan hanya karakter null yang menyebabkan grep mempertimbangkannya biner. Ini hanya diuji untuk grep. Perintah less dan diff, misalnya, mungkin memiliki metode yang berbeda. Kontrol karakter secara umum tidak muncul kecuali dalam biner. Pengecualian adalah karakter spasi: baris baru (^ M), tab (^ I), formfeed (^ L), tab vertikal (^ K), dan kembali (^ J).
Namun, karakter asing, seperti huruf Arab atau Cina, bukan ascii standar, dan mungkin dapat dikacaukan dengan karakter kontrol. Mungkin itu sebabnya itu hanya karakter nol.
Anda dapat mengujinya sendiri dengan memasukkan karakter kontrol ke dalam file teks menggunakan vim editor teks. Masuk saja ke mode insert, tekan control-v, dan kemudian control character.
sumber
Implementasi grep modern yang khas hanya akan mendeklarasikan file "biner" jika ada nul byte di dalamnya. Ada lagi yang harus beres.
Saya tidak dapat berbicara untuk implementasi grep yang Anda gunakan ...
sumber
Kesalahan penyandian menurut mbrlen () juga membuat GNU grep 2.24 menganggapnya sebagai biner
Misalnya:
karena
\x80
tidak bisa menjadi byte pertama dari titik Unicode UTF-8: https://en.wikipedia.org/wiki/UTF-8#DescriptionIni adalah satu-satunya kemungkinan lain selain itu
NUL
.grep
Interpretasi kode sumber GNU yang mengarah ke kesimpulan ini: Apa yang membuat grep menganggap file sebagai biner?sumber