Puedo usar el comando "script" para grabar una sesión interactiva en la línea de comandos. Sin embargo, esto incluye todos los caracteres de control y códigos de color Puedo eliminar los caracteres de control (como el retroceso) con "col -b", pero no puedo encontrar una forma sencilla de eliminar los códigos de color.
Tenga en cuenta que quiero usar la línea de comando de la manera normal, por lo que no quiero desactivar los colores allí, solo quiero eliminarlos de la salida del script. Además, sé que puedo jugar e intentar encontrar una expresión regular para arreglar las cosas, pero espero que haya una solución más simple (y más confiable, ¿qué pasa si hay un código que no conozco cuando desarrollo la expresión regular?).
Para mostrar el 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
Respuesta aceptada:
La siguiente secuencia de comandos debe filtrar todas las secuencias de control ANSI/VT100/xterm (basadas en ctlseqs). Probado mínimamente, por favor informe cualquier coincidencia insuficiente o superior.
#!/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;
}
Problemas conocidos:
- No se queja de las secuencias mal formadas. No es para eso para lo que es este script.
- No se admiten argumentos de cadena de varias líneas para DCS/PM/APC/OSC.
- Los bytes en el rango 128–159 se pueden analizar como caracteres de control, aunque esto rara vez se usa. Aquí hay una versión que analiza los caracteres de control que no son ASCII (esto alterará el texto que no es ASCII en algunas codificaciones, incluida 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;
}