Memeriksa output dari
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'
dalam editor teks (misalnya, vi
) menunjukkan yang berikut:
^[[37mABC
^[[0m
Bagaimana cara menghapus kode warna ANSI dari file output? Saya kira cara terbaik adalah menyalurkan output melalui semacam editor aliran.
Berikut ini tidak berfungsi
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'
more
atauless -R
yang dapat menafsirkan kode pelarian sebagai warna, bukan editor teks.Jawaban:
Karakter
^[[37m
dan^[[0m
merupakan bagian dari urutan pelarian ANSI (kode CSI) . Lihat juga spesifikasi ini .Menggunakan GNU
sed
\x1b
(atau\x1B
) adalah karakter spesial pelarian(
sed
tidak mendukung alternatif\e
dan\033
)\[
adalah karakter kedua dari urutan pelarian[0-9;]*
adalah nilai warna regexm
adalah karakter terakhir dari urutan pelarian⚠ Pada macOS,
sed
perintah default tidak mendukung karakter khusus seperti yang\e
ditunjukkan oleh slm dan steamer25 di komentar. Gunakan sebaliknyagsed
yang dapat Anda instal menggunakanbrew install gnu-sed
.Contoh dengan baris perintah OP : (OP berarti Poster Asli)
Tom Hale menyarankan untuk menghapus semua urutan pelarian lainnya dengan menggunakan
[a-zA-Z]
alih-alih hanya huruf yangm
spesifik untuk urutan melarikan diri mode grafis (warna). Tetapi[a-zA-Z]
mungkin terlalu lebar dan bisa menghapus terlalu banyak. Michał Faleński dan Miguel Mota mengusulkan untuk menghapus hanya beberapa urutan melarikan diri menggunakan[mGKH]
dan[mGKF]
masing - masing. Britton Kerin menunjukkanK
juga harus digunakan selainm
untuk menghapus warna darigcc
kesalahan / peringatan (jangan lupa untuk mengarahkan ulanggcc 2>&1 | sed...
).Menggunakan
perl
Versi yang
sed
diinstal pada beberapa sistem operasi mungkin terbatas (mis. MacOS). Perintah iniperl
memiliki keuntungan karena secara umum lebih mudah untuk menginstal / memperbarui pada lebih banyak sistem operasi. Adam Katz menyarankan untuk menggunakan\e
(sama seperti\x1b
) di PCRE .Pilih regex Anda tergantung pada seberapa banyak perintah yang ingin Anda filter:
Contoh dengan baris perintah OP:
Pemakaian
Seperti yang ditunjukkan oleh komentar Stuart Cardall ,
sed
baris perintah ini digunakan oleh proyek Ultimate Nginx Bad Bot (1000 bintang) untuk membersihkan laporan email ;-)sumber
sed
perintah dan penjelasannya. :)1;31m
Jadi lebih baik tambahkan;
ke regex Anda:cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'
atau tidak akan dilucuti.sed
tidak berfungsi dengan contoh yang diperlihatkan,gsed
namun versi tersebut tidak.brew install gnu-sed
.Saya telah menemukan penghilang urutan pelarian yang lebih baik. Periksa ini:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
sumber
sed -r
TIDAK.Apa yang ditampilkan sebagai
^[
yang tidak^
dan[
; itu adalahESC
karakter ASCII , diproduksi oleh Escatau Ctrl[(^
notasi berarti kunci Ctrl).ESC
adalah 0x1B heksadesimal atau 033 oktal, jadi Anda harus menggunakan\x1B
atau\033
di regex Anda:sumber
Jika Anda lebih suka sesuatu yang sederhana, Anda bisa menggunakan modul strip-ansi ( diperlukan Node.js ):
Kemudian gunakan seperti ini:
Atau cukup masukkan string:
sumber
cat
( UUOC ) - itu harus mungkin dilakukanstrip-ansi colors.o
atau setidaknyastrip-ansi < colors.o
.strip-ansi < colors.o
, tetapi dari pengalaman orang lebih akrab dengan perpipaan. Saya sudah memperbarui jawabannya.commandlinefu memberikan jawaban ini yang menghilangkan warna ANSI serta perintah gerakan:
Untuk warna saja, Anda ingin:
sumber
Saya percaya ini adalah penghapusan semua urutan melarikan diri ANSI :
(Harap dicatat bahwa perl, seperti banyak bahasa lain (tetapi tidak sed), menerima
\e
sebagai karakter pelarian Esc,\x1b
atau\033
dengan kode, ditunjukkan dalam terminal sebagai^[
. Saya menggunakannya di sini karena tampaknya lebih intuitif.)Perintah perl ini, yang bisa Anda jalankan semua dalam satu baris jika Anda mau, memiliki empat penggantian di dalamnya:
Yang pertama setelah sekuens CSI (urutan kode escape yang dimulai dengan "Control Sequence Introducer" of Esc[, yang mencakup lebih banyak daripada sekuens Select Graphic Rendition yang membentuk kode warna dan dekorasi teks lainnya).
Penggantian kedua menghapus urutan yang tersisa yang melibatkan karakter tambahan dan diakhiri dengan ST (Terminator String, Esc\). Penggantian ketiga adalah hal yang sama tetapi juga memungkinkan Sistem Operasi Command urutan untuk mengakhiri dengan BEL (
\x07
,\007
, sering\a
).Penggantian keempat menghilangkan sisa yang tersisa.
Juga pertimbangkan untuk menghapus karakter ASCII dengan lebar nol lainnya seperti BEL dan karakter kontrol C0 dan C1 lainnya yang tidak jelas . Saya telah menggunakan
s/[\x00-\x1f\x7f-\x9f\xad]+//g
, yang juga termasuk Hapus dan Tanda Hubung Lunak . Ini tidak termasuk karakter nol-lebar berkode lebih tinggi dari Unicode, tetapi saya percaya ini lengkap untuk ASCII (Unicode\x00
-\xff
). Jika Anda melakukan ini, hapus yang terakhir karena mereka dapat terlibat dalam urutan yang lebih panjang.sumber
Pertanyaan "dijawab" tidak berhasil untuk saya, jadi saya membuat regex ini sebagai gantinya untuk menghapus urutan pelepasan yang dihasilkan oleh perl Term :: ANSIColor module.
Regex Grawity seharusnya bekerja dengan baik, tetapi menggunakan + tampaknya juga berfungsi.
sumber
The "answered" question
? Apakah maksud Anda jawaban yang diterima? (2) Perintah ini tidak berfungsi - bahkan tidak mengeksekusi - karena ia memiliki kutipan yang tidak cocok (tidak seimbang). (3) Ini penggunaan yang tidak bergunacat
( UUOC ) - itu harus mungkin dilakukan . (4) Siapa yang pernah mengatakan sesuatu tentang kode yang ada dalam file?perl -pe
command
colors.o
.o
"tput sgr0" meninggalkan karakter kontrol ini ^ (B ^ [
Ini adalah versi yang dimodifikasi untuk mengatasi hal itu.
sumber
tput sgr0
bahwa solusi lain sepertinya tidak pernah bisa dihilangkan.Saya memiliki masalah yang sama dengan menghapus karakter yang ditambahkan dari mengumpulkan output top interaktif melalui dempul dan ini membantu:
sumber
cat
( UUOC ) - itu harus mungkin dilakukan .perl -pe
command
putty1.log
Inilah yang bekerja untuk saya (diuji pada Mac OS X)
sumber