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