GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendeteksi jika suatu file memiliki BOM UTF-8 di Bash?

Pertama, mari kita tunjukkan head itu sebenarnya bekerja dengan benar:

$ printf '\xef\xbb\xbf' >file
$ head -c 3 file 
$ head -c 3 file | hexdump -C
00000000  ef bb bf                                          |...|
00000003

Sekarang, mari buat fungsi kerja has_bom . Jika grep Anda mendukung -P , maka salah satu opsinya adalah:

$ has_bom() { head -c3 "$1" | LC_ALL=C grep -qP '\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes

Saat ini, hanya GNU grep mendukung -P .

Pilihan lainnya adalah menggunakan $'...' bash :

$ has_bom() { head -c3 "$1" | grep -q $'\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes

ksh dan zsh juga mendukung $'...' tetapi konstruk ini bukan POSIX dan dash tidak mendukungnya.

Catatan:

  1. Penggunaan return $? eksplisit adalah opsional. Secara default, fungsi akan kembali dengan kode keluar dari perintah terakhir yang dijalankan.

  2. Saya telah menggunakan formulir POSIX untuk mendefinisikan fungsi. Ini setara dengan bentuk bash tetapi memberi Anda satu masalah yang lebih sedikit untuk ditangani jika Anda harus menjalankan fungsi di bawah shell lain.

  3. bash menerima penggunaan karakter - dalam nama fungsi tetapi ini adalah fitur yang kontroversial. Saya menggantinya dengan _ yang lebih diterima secara luas. (Untuk informasi lebih lanjut tentang masalah ini, lihat jawaban ini.)

  4. -q opsi untuk grep membuatnya diam, artinya masih menyetel kode keluar yang tepat tetapi tidak mengirim karakter apa pun ke stdout.


Saya menerapkan hal berikut untuk baris baca pertama:

read c
if (( "$(printf "%d" "'${c:0:1}")" == 65279 ))  ; then c="${c:1}" ; fi

Ini hanya menghapus BOM dari variabel.


Linux
  1. Cara Mengonversi File ke Encoding UTF-8 di Linux

  2. Bagaimana Cara Menghapus Bom Dari File Utf-8?

  3. Apakah Mungkin Untuk Mendeteksi Saat File Telah Diunduh?

  1. Bagaimana Cara Mendeteksi Bash>=4.0?

  2. Bagaimana Anda menormalkan jalur file di Bash?

  3. Bagaimana cara mengurai file CSV di Bash?

  1. Bagaimana cara memeriksa apakah Bash memiliki Kerentanan Shellshock?

  2. Bagaimana cara memeriksa syslog di Bash di Linux?

  3. Bagaimana cara mengkode ulang ke UTF-8 secara kondisional?