GNU/Linux >> Linux Esercitazione >  >> Linux

Rimuovere i caratteri di controllo (inclusi i codici e i colori della console) dall'output dello script?

Posso usare il comando "script" per registrare una sessione interattiva dalla riga di comando. Tuttavia, questo include tutti i caratteri di controllo e codici colore. Posso rimuovere i caratteri di controllo (come backspace) con "col -b", ma non riesco a trovare un modo semplice per rimuovere i codici colore.

Nota che voglio usare la riga di comando nel modo normale, quindi non voglio disabilitare i colori lì:voglio solo rimuoverli dall'output dello script. Inoltre, so che posso giocare e provare a trovare un'espressione regolare per sistemare le cose, ma spero che ci sia una soluzione più semplice (e più affidabile - e se c'è un codice che non conosco quando sviluppo l'espressione regolare?).

Per mostrare il problema:

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

Risposta accettata:

Lo script seguente dovrebbe filtrare tutte le sequenze di controllo ANSI/VT100/xterm per (basate su ctlseqs). Testato minimamente, si prega di segnalare qualsiasi corrispondenza insufficiente o eccessiva.

#!/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;
}

Problemi noti:

  • Non si lamenta di sequenze malformate. Non è a questo che serve questo script.
  • Gli argomenti di stringa su più righe per DCS/PM/APC/OSC non sono supportati.
  • I byte nell'intervallo 128–159 possono essere analizzati come caratteri di controllo, sebbene questo sia usato raramente. Ecco una versione che analizza i caratteri di controllo non ASCII (questo modificherà il testo non ASCII in alcune codifiche tra cui 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. Esecuzione di uno script Python da PHP

  2. Come reindirizzare l'output da grep a cp?

  3. Esecuzione di Pycharm come root dal programma di avvio

  4. Esegui uno script da qualsiasi luogo

  5. grep output da lungo a largo

Colora l'output dei sensori?

Come vedere l'output di uno script PHP?

Libreria di output di script di shell colorata

Rientro dell'output su più righe in uno script di shell

Intercetta l'input e l'output da un eseguibile specifico

Come utilizzare /dev/fb0 come console dallo spazio utente o inviare testo ad esso