TL; DR:
grep -axv '.*' out.txt
jawaban panjang
Kedua jawaban ini sangat menyesatkan dan pada dasarnya salah.
Untuk menguji, Dapatkan dua file ini (dari pengembang yang sangat dihormati: Markus Kuhn):
$ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
$ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
Demo
Yang pertama UTF-8-demo.txt
adalah file yang dirancang untuk menunjukkan seberapa baik UTF-8 mampu menyajikan banyak bahasa, matematika, huruf braille dan banyak jenis karakter berguna lainnya. Lihatlah dengan editor teks (yang mengerti utf-8) dan Anda akan melihat banyak contoh dan tidak �
.
Tes yang diajukan oleh satu jawaban: untuk membatasi rentang karakter \x00-\x7F
akan menolak hampir semua yang ada di dalam file ini.
Itu sangat salah dan tidak akan menghapus apa pun �
karena tidak ada dalam file itu .
Menggunakan tes yang direkomendasikan dalam jawaban itu akan menghapus 72.5 %
file:
$ grep -oP "[^\x00-\x7F]" UTF-8-demo.txt | tr -d '\n' | wc -c
10192
$ cat UTF-8-demo.txt | wc -c
14058
Itu (untuk tujuan paling praktis) seluruh file. File yang dirancang dengan sangat baik untuk menampilkan karakter yang benar-benar valid.
Uji
File kedua dirancang untuk mencoba beberapa kasus perbatasan untuk mengonfirmasi bahwa pembaca utf-8 melakukan pekerjaan dengan baik. Berisi di dalam banyak karakter yang akan menyebabkan ' ' ditampilkan. Tetapi rekomendasi jawaban yang lain (yang dipilih) untuk digunakan file
gagal total dengan file ini. Hanya menghapus nol byte ( \0
) (yang secara teknis ASCII valid) dan \x7f
byte (DEL - delete) (yang jelas merupakan karakter ASCII juga) akan membuat semua file valid untuk file
perintah:
$ cat UTF-8-test.txt | tr -d '\0\177' > a.txt
$ file a.txt
a.txt: Non-ISO extended-ASCII text, with LF, NEL line terminators
Tidak hanya file
gagal mendeteksi banyak karakter yang salah, tetapi juga gagal mendeteksi dan melaporkan bahwa itu adalah file yang disandikan UTF-8.
Dan ya, file
dapat mendeteksi dan melaporkan teks yang disandikan UTF-8:
$ echo "ééakjfhhjhfakjfhfhaéá" | file -
/dev/stdin: UTF-8 Unicode text
Juga, file
gagal melaporkan sebagai ASCII sebagian besar karakter kontrol dalam rentang 1 hingga 31. Ini ( file
) melaporkan beberapa rentang sebagai data
:
$ printf '%b' "$(printf '\\U%x' {1..6})" | file -
/dev/stdin: data
Lainnya sebagai ASCII text
:
$ printf '%b' "$(printf '\\U%x' 7 {9..12})" | file -
/dev/stdin: ASCII text
Sebagai rentang karakter yang dapat dicetak (dengan baris baru):
$ printf '%b' "$(printf '\\U%x' {32..126} 10)" | file -
/dev/stdin: ASCII text
Tetapi beberapa rentang dapat menyebabkan hasil yang aneh:
$ printf '%b' "$(printf '\\U%x' {14..26})" | file -
/dev/stdin: Atari MSA archive data, 4113 sectors per track, starting track: 5141, ending track: 5655
Program file
ini bukan alat untuk mendeteksi teks, tetapi untuk mendeteksi angka ajaib dalam program atau file yang dapat dieksekusi.
Rentang file
mendeteksi, dan jenis yang sesuai yang dilaporkan yang saya temukan adalah:
Nilai satu byte, sebagian besar ascii:
{1..6} {14..26} {28..31} 127 :data
{128..132} {134..159} :Non-ISO extended-ASCII text
133 :ASCII text, with LF, NEL line terminators
27 :ASCII text, with escape sequences
13 :ASCII text, with CR, LF line terminators
8 :ASCII text, with overstriking
7 {9..12} {32..126} :ASCII text
{160..255} :ISO-8859 text
Rentang terenkode utf-8:
{1..6} {14..26} {28..31} 127 :data
27 :ASCII text, with escape sequences
13 :ASCII text, with CR, LF line terminators
8 :ASCII text, with overstriking
7 {9..12} {32..126} :ASCII text
{128..132} {134..159} :UTF-8 Unicode text
133 :UTF-8 Unicode text, with LF, NEL line terminators
{160..255} :UTF-8 Unicode text
{256..5120} :UTF-8 Unicode text
Salah satu solusi yang mungkin ada di bawah ini.
Jawaban Sebelumnya.
Nilai Unicode untuk karakter yang Anda posting adalah:
$ printf '%x\n' "'�"
fffd
Ya, itu adalah Karakter Unicode 'REPLACEMENT CHARACTER' (U + FFFD) . Itu adalah karakter yang digunakan untuk mengganti karakter Unicode tidak valid yang ditemukan dalam teks. Ini adalah "bantuan visual", bukan karakter nyata. Untuk menemukan dan mendaftar setiap baris penuh yang berisi karakter UNICODE yang tidak valid, gunakan:
grep -axv '.*' out.txt
tetapi jika Anda hanya ingin mendeteksi jika ada karakter yang tidak valid, gunakan:
grep -qaxv '.*' out.txt; echo $?
Jika hasilnya 1
file bersih, jika tidak akan menjadi nol 0
.
Jika yang Anda tanyakan adalah: bagaimana menemukan �
karakter, maka, gunakan ini:
➤ a='Basically, if the file "out.txt" contains "�" anywhere in the file I'
➤ echo "$a" | grep -oP $(printf %b \\Ufffd)
�
Atau jika sistem Anda memproses teks UTF-8 dengan benar, cukup:
➤ echo "$a" | grep -oP '�'
�
grep
lama mengerti unicode (yang membuatnya jauh lebih lambat, jadi untuk mencari string ascii, aLANG=C grep
adalah peningkatan kinerja yang sangat besar).