Tangkapan layar muncul untuk menunjukkan kode warna ANSI rusak , yang mengontrol rendering teks. Teks tebal / cerah dihasilkan dengan urutan ␛[1m
, yang biasanya ditafsirkan oleh terminal Anda dan tidak ditampilkan di layar secara langsung: itu hanya membuat bit teks berikutnya cerah. Screenshot dari un grep
ped output menunjukkan bahwa perbedaan warna antara label dan nilai pada setiap baris, sehingga output asli menggunakannya.
Tampaknya urutan itu telah diputus oleh final Anda grep
, yang cocok dengan "m" dalam kode (karena itu huruf [a-z]
) dan mencoba menyorotnya dalam warna merah itu sendiri. Yang meninggalkan urutan pelarian sebagian di belakang, yang tidak bisa diproses terminal Anda.
Karakter melarikan diri ␛
adalah U + 001B, yang merupakan angka heksadesimal yang diberikan dalam kotak karakter yang tidak dikenal. Apa yang ditampilkan adalah jalan keluar (kotak), a [
, a 1
, merah m
diikuti oleh teks yang cocok "eng" yang diharapkan, dan yang sama terjadi di akhir dengan "22" (kode numerik untuk "warna normal & intensitas").
Output yang rusak benar-benar:
␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m
di mana ␛[31m
membuat teks merah dan ␛[22m
mengubahnya kembali menjadi putih, keduanya disisipkan di grep
sekitar m
karakter ke dalam teks asli. Aslinya hanya:
␛ [1m eng ␛ [22m
yang hanya " eng
" cerah dan kemudian beralih kembali ke teks normal.
Anda bisa memeriksanya dengan mengubah final Anda grep
menjadi grep --color=always
dan menyalurkan ke hexdump
, yang akan menunjukkan semua karakter yang tidak patut dicetak dan yang ditafsirkan oleh terminal Anda.
Anda bisa mengatasinya dengan beberapa cara. Pertama adalah menggunakan grep
tanpa alias Anda untuk saat ini:
./trans --id --input /path/to/txt | grep ISO | \grep [a-z]
Backslash untuk sementara melompati alias dan berjalan grep
secara langsung.
Cara lain adalah menghapus kode ANSI dari perintah asli, yang ada beberapa saran dalam pertanyaan ini :
./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]
Namun pilihan lain adalah menambahkan pipa asing di akhir:
./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat
Karena hasil akhir grep
tidak langsung ke TTY, tetapi cat
melalui pipa, itu tidak akan memasukkan highlight berwarna.
Mungkin opsi terbaik adalah untuk mendapatkan Translate Shell untuk berhenti menggunakan urutan kontrol terminal di output sendiri di tempat pertama ketika tidak ke terminal. Itu akan melibatkan laporan bug dari Anda kepada pembuatnya dan perbaikan kode ke ansi()
fungsi Shell , tetapi orang dapat melakukannya dengan sedikit:
TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
Ini melewati dumb
jenis terminal di lingkungan Translate Shell, yang setidaknya diakui tidak memiliki dukungan warna ECMA-48. (Sedihnya, Translate Shell tidak menggunakan terminfo, dan hanya perangkat keras dalam kode sendiri jenis terminal yang dipahami dan urutan kontrol yang digunakannya.)