GNU/Linux >> Belajar Linux >  >> Linux

Menghapus Karakter Kontrol (termasuk Kode / Warna Konsol) Dari Output Skrip?

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;
}

Linux
  1. Dari Mana Skrip Shell Dijalankan?

  2. Menghapus Redundansi Dari Kolom Keluaran?

  3. Jalankan skrip bash dari URL

  1. Linux menambahkan output konsol ke file log?

  2. Bagaimana cara menyalurkan output dari grep ke cp?

  3. Menjalankan Pycharm sebagai root dari launcher

  1. Linux – Bagaimana Cara Menggunakan /dev/fb0 Sebagai Konsol Dari Userspace, Atau Teks Output Ke Itu?

  2. Jalankan skrip dari mana saja

  3. keluaran grep dari panjang ke lebar