Saya dapat menggunakan perintah "script" untuk merekam sesi interaktif di baris perintah. Namun, ini mencakup semua karakter kontrol dan kode warna. Saya dapat menghapus karakter kontrol (seperti spasi mundur) dengan "col -b", tetapi saya tidak dapat menemukan cara sederhana untuk menghapus kode warna.
Perhatikan bahwa saya ingin menggunakan baris perintah dengan cara biasa, jadi saya tidak ingin menonaktifkan warna di sana – saya hanya ingin menghapusnya dari keluaran skrip. Juga, saya tahu dapat bermain-main dan mencoba menemukan regexp untuk memperbaikinya, tetapi saya berharap ada solusi yang lebih sederhana (dan lebih dapat diandalkan - bagaimana jika ada kode yang saya tidak tahu ketika saya mengembangkan regexp?).
Untuk menunjukkan masalahnya:
spl62 tmp: script Script started, file is typescript spl62 lepl: ls add-licence.sed build-example.sh commit-test push-docs.sh add-licence.sh build.sh delete-licence.sed setup.py asn build-test.sh delete-licence.sh src build-doc.sh clean doc-src test.ini spl62 lepl: exit Script done, file is typescript spl62 tmp: cat -v typescript Script started on Thu 09 Jun 2011 09:47:27 AM CLT spl62 lepl: ls^M ^[[0m^[[00madd-licence.sed^[[0m ^[[00;32mbuild-example.sh^[[0m ^[[00mcommit-test^[[0m ^[[00;32mpush-docs.sh^[[0m^M ^[[00;32madd-licence.sh^[[0m ^[[00;32mbuild.sh^[[0m ^[[00mdelete-licence.sed^[[0m ^[[00msetup.py^[[0m^M ^[[01;34masn^[[0m ^[[00;32mbuild-test.sh^[[0m ^[[00;32mdelete-licence.sh^[[0m ^[[01;34msrc^[[0m^M ^[[00;32mbuild-doc.sh^[[0m ^[[00;32mclean^[[0m ^[[01;34mdoc-src^[[0m ^[[00mtest.ini^[[0m^M spl62 lepl: exit^M Script done on Thu 09 Jun 2011 09:47:29 AM CLT spl62 tmp: col -b < typescript Script started on Thu 09 Jun 2011 09:47:27 AM CLT spl62 lepl: ls 0m00madd-licence.sed0m 00;32mbuild-example.sh0m 00mcommit-test0m 00;32mpush-docs.sh0m 00;32madd-licence.sh0m 00;32mbuild.sh0m 00mdelete-licence.sed0m 00msetup.py0m 01;34masn0m 00;32mbuild-test.sh0m 00;32mdelete-licence.sh0m 01;34msrc0m 00;32mbuild-doc.sh0m 00;32mclean0m 01;34mdoc-src0m 00mtest.ini0m spl62 lepl: exit Script done on Thu 09 Jun 2011 09:47:29 AM CLT
Jawaban yang Diterima:
Skrip berikut harus memfilter semua urutan kontrol ANSI/VT100/xterm untuk (berdasarkan ctlseqs). Diuji minimal, laporkan jika ada yang kurang atau lebih cocok.
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
s/ e[ #%()*+-./]. |
e[ [ -?]* [@-~] | # CSI ... Cmd
e] .*? (?:e\|[ax9c]) | # OSC ... (ST|BEL)
e[P^_] .*? (?:e\|x9c) | # (DCS|PM|APC) ... ST
e. //xg;
print;
}
Masalah yang diketahui:
- Tidak mengeluh tentang urutan yang salah. Bukan untuk itu skrip ini.
- Argumen string multi-baris ke DCS/PM/APC/OSC tidak didukung.
- Byte dalam rentang 128–159 dapat diuraikan sebagai karakter kontrol, meskipun ini jarang digunakan. Berikut adalah versi yang mem-parsing karakter kontrol non-ASCII (ini akan memecah teks non-ASCII dalam beberapa penyandian termasuk UTF-8).
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
s/ e[ #%()*+-./]. |
(?:e[|x9b) [ -?]* [@-~] | # CSI ... Cmd
(?:e]|x9d) .*? (?:e\|[ax9c]) | # OSC ... (ST|BEL)
(?:e[P^_]|[x90x9ex9f]) .*? (?:e\|x9c) | # (DCS|PM|APC) ... ST
e.|[x80-x9f] //xg;
print;
}