GNU/Linux >> Tutoriales Linux >  >> Linux

¿Eliminar los caracteres de control (incluidos los códigos/colores de la consola) de la salida del script?

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

Linux
  1. Evitar que un script bash se ejecute simultáneamente

  2. ¿Desde dónde se ejecuta un script de Shell?

  3. ¿Quitar la redundancia de las columnas de salida?

  4. ¿Linux agrega la salida de la consola a un archivo de registro?

  5. Sangrado de salida de varias líneas en un script de shell

¿Colorear la salida de los sensores?

¿Cómo ver la salida de un script PHP?

Biblioteca de salida de scripts de shell de colores

Interceptar entrada y salida de un ejecutable específico

Cómo usar /dev/fb0 como una consola desde el espacio de usuario, o enviarle texto

salida grep de largo a ancho