Bagaimana cara saya menghapus semua karakter non-ascii dari satu file? Apakah akan ada perintah khusus untuk melakukan ini?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
Saya percaya ini menemukan karakter dalam alur kerja, tetapi bagaimana saya akan menghapus semua contoh karakter yang dimaksud?
text-processing
ascii
Mizole Ni
sumber
sumber
cat -v
untuk menunjukkannya dalam representasi ASCII untuk mereka. (mis.^G
untuk\007
)Jawaban:
Karakter ASCII adalah karakter dalam rentang dari 0 hingga 177 (oktal) secara inklusif .
Untuk menghapus karakter di luar rentang ini dalam file, gunakan
The
tr
perintah adalah utilitas yang bekerja pada karakter tunggal , baik mengganti mereka dengan karakter tunggal lainnya (transliterasi), menghapus mereka, atau mengompresi berjalan dari karakter yang sama ke dalam satu karakter.Perintah di atas akan membaca dari
file
dan menulis konten yang dimodifikasinewfile
. The-d
pilihan untuktr
merek utilitas karakter delete (bukan transliterasi mereka), dan-c
membuatnya mempertimbangkan karakter luar interval tertentu (bukan dalam).LC_ALL=C
memastikan bahwa setiap nilai byte membentuk karakter yang valid. Tanpa itu, beberapatr
implementasi akan dibatalkan jika mereka menemukan urutan byte yang tidak membentuk karakter yang valid dalam pengkodean karakter lokal.Untuk mengganti file asli dengan yang dimodifikasi, gunakan
Ini mengganti nama file baru dengan nama file lama setelah
tr
selesai dengan sukses. Jikatr
tidak berhasil diselesaikan, baik karena tidak bisa membaca file asli atau tidak menulis ke file baru, file asli akan dibiarkan tidak berubah.Atau, untuk mempertahankan sebanyak mungkin meta data (izin dll.) Dari file asli, gunakan
sumber
Dengan
perl
sumber
Jika yang Anda butuhkan hanyalah sebuah regex:
[\x00-\x7F]
yang dapat Anda terapkan ke beberapa utilitas:Pahami bahwa sed, awk, dan perl mengharapkan "file teks" sebagaimana didefinisikan dalam Unix. Semua berfungsi dengan baik dalam hal ini. Tetapi secara khusus, awk menambahkan baris baru yang tertinggal (apakah ada di file sumber atau tidak) (menggunakan printf menghapus SEMUA baris baru pada input). Tr dirancang untuk bekerja dengan semua jenis file. Namun NUL (
\0
) bukan karakter yang valid dalam file teks POSIX dan harus dihindari:Bahkan, banyak karakter kontrol akan menghasilkan masalah lain dalam beberapa kondisi tertentu.
Jadi, mungkin Anda perlu
[\x07-\x0d\x20-\x7e]
Kisaran 7-13 (dalam desimal) adalah
\a\b\t\n\v\f\r
(berurutan).Kisaran yang serupa (mungkin lebih portabel) dapat ditulis sebagai
[^[:space:][:print:]] (similar because it doesn't include
\ a \ b` --bell dan backspace--).Terkait:
Regex setiap
solusi ASCII karakter Perl
File Teks Posix
sumber
tr
dapat berupa jenis file apa pun, bukan hanya file teks.awk
di sisi lain, mengambil file teks.gensub()
adalah ekstensi gawk. Anda ingingsub(...); print
, dan menggunakan oktal alih-alih urutan hex (dan LC_ALL = C) menjadi (lebih) portabel.[^\o0]
adalah untuk mencocokkan karakter selain backslash, o dan 0 di POSIXsed
(dalam semua implementasi kecuali GNU sed). Itu bukan batasan GNUsed
tetapi ekstensi yang tidak patuh, karena itu dinonaktifkan ketika POSIXLY_CORRECT berada di lingkungan).