Saya mengalami masalah dengan file teks yang ditandai sebagai biner

3

Saya memiliki file yang dapat dieksekusi yang menghasilkan file teks sebagai hasilnya. Masalahnya adalah bahwa file teks keluar dengan semacam flag file biner. Hasilnya kira-kira seperti ini:

$ grep "grep string" output_file.txt
Binary file output_file.txt matches.

$ grep -a "grep string" output_file.txt
[correct results]

Beberapa bacaan mengindikasikan bahwa grep mencari karakter nol dalam ribuan atau lebih byte pertama, kemudian menentukan apakah sebuah file 'biner' atau tidak, jadi pertanyaan saya ada dua:

  1. Apakah ada cara mudah untuk menghapus karakter nol dari file saya (saya bisa melakukan ini sebagai bagian dari post-processing saya) untuk memastikan bahwa grep bekerja dengan benar tanpa tanda -a?

  2. Apakah ada sesuatu yang jelas harus saya cari dalam kode saya untuk mencegah karakter nol ditulis ke file? Saya telah memeriksa kode dengan seksama dan saya tidak melihat penyebab yang jelas.

    .

brightwellcd
sumber

Jawaban:

5

Saya bisa menjawab setidaknya pertanyaan pertama. Jika Anda menggunakan Unix / Linux, Anda dapat menggunakan tr

tr -d '\000' < filein > fileout

di mana \ 000 adalah null char. Anda juga dapat menghapus semua karakter yang tidak dapat dicetak seperti yang Anda lihat pada contoh di sini: "Unix Editing Teks: sed, tr, cut, od, awk"

Mengenai pertanyaan kedua Anda, saya tidak tahu mana bahasa pemrograman Anda, tetapi saya akan mencari variabel yang tidak diinisialisasi yang dapat dicetak pada file output.

DrNoone
sumber
Saya akan memilih ini jika saya bisa, tetapi saya tampaknya terlalu baru. : - /
brightwellcd
Saya menemukan string nol di output saya. Saya menjalankan skrip tr ini dan melakukan diff visual; dengan cepat menemukan masalahnya. Saya akan memperbaiki ini jika / ketika saya mendapatkan reputasi yang cukup untuk melakukannya. Terima kasih.
brightwellcd
4

Aku akan menebak ....

Program Anda menulis file dalam UTF-16, sebuah pengkodean Unicode yang menggunakan dua byte untuk setiap karakter. Setiap byte kedua, sebagian besar waktu, adalah nol.

iconv -f utf-16 -t utf-8 < filein > fileout

akan mengubahnya menjadi UTF-8, yang paling nyaman digunakan oleh coreutils.

grawity
sumber
Menarik, dan saya tidak tahu ini tentang UTF-16. Sebuah pertanyaan tentang perintah ini - apa tepatnya yang dihapus atau dilakukan percakapan terhadap file? Bagaimana kelakuannya dalam kasus penggunaan pertanyaan saya di sini ?
Hashim
1
@Hashim: Tidak cukup menghapus apa pun; ia membaca nilai dalam satu representasi dan menulis nilai yang sama di yang lain. (Seperti halnya mengkonversi antara hex dan oktal, atau antara PNG dan BMP.) UTF-16 mewakili setiap nilai codepoint sebagai kode dua-byte panjang-tetap (atau sepasang dua kode seperti itu), yang secara alami harus diisi dengan 0x00 byte jika nilainya di bawah 256, sedangkan UTF-8 mewakili nilai yang sama dengan kode panjang variabel yang tidak memerlukan null-padding. Bagaimana itu akan berperilaku dengan file Anda tergantung pada apakah file Anda UTF-16 untuk memulai.
grawity
@Hashim Apakah ada cara untuk menentukan apakah suatu file adalah UTF-16? Melakukan file myfile.txthanya menunjukkan file sebagai data.
Hashim
Jika itu teks dan terlihat seperti teks dalam editor teks Anda, lihat apa pengkodean yang terdeteksi oleh editor. Cobalah untuk melakukan konversi, dan periksa apakah hasilnya masih terlihat seperti teks di editor teks Anda. Atau lakukan hexdump file Anda, jika Anda melihat bahwa "setiap byte kedua" adalah 0x00, itu hampir selalu berarti UTF-16.
grawity
Sayangnya membuka file dalam editor adalah keluar dari pertanyaan karena file yang saya kerjakan terlalu besar - semuanya lebih dari 10GB. Jika tidak ada byte NUL di kolom kedua hexdump, apakah aman untuk menyimpulkan bahwa file tersebut jelas bukan UTF-16?
Hashim