¿Puedo “grabar” códigos de control ANSI programáticamente en un archivo usando utilidades de Unix?

Ejemplo: comienzo a grabar con script y trato de escribir echo test pero omito la o, así que retrocedo para corregirla.

Cuando ech test^H^[[K^H^[[K^H^[[K^H^[[K^H^[[Ko test^M cat typescript todo parece normal, ya que los códigos se interpretan, pero si uso less o vim veo ech test^H^[[K^H^[[K^H^[[K^H^[[K^H^[[Ko test^M

Entiendo completamente qué es esto y por qué está sucediendo, pero ¿hay alguna manera de “grabar” los códigos y simplemente ver el resultado en un archivo? Mi método kludgy es cagar el archivo, luego copiar / pegar el texto de la terminal, pero seguramente alguna combinación de cat, sed, awk, o alguna otra cosa me puede llevar allí más fácilmente.

Para visualizar un archivo que contiene secuencias ANSI,

 less -r typescript 

O,

 less -R typescript 

Para eliminar ANSI y las secuencias de retroceso de un archivo, creando un nuevo archivo limpio, intente:

 sed -r ':again; s/[^\x08]\x08\x1b\[K//; t again; s/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g' typescript >newfile 

Cómo funciona

  • -r

    Esto activa expresiones regulares extendidas. (En los sistemas BSD, -r debe reemplazarse por -E . Las versiones modernas de GNU sed aceptarán -r o -E ).

  • `: de nuevo; s / [^ \ x08] \ x08 \ x1b [K //; t de nuevo

    Esto elimina cualquier secuencia de retroceso. Estos se realizan uno a la vez en un bucle.

  • s/\x1b_[^\x1b]*\x1b[\]//g

    Como una extensión xterm (ver documentación ), Esc _ something Esc \ no hará nada. Este comando elimina estas secuencias.

  • s/\x1B\[[^m]*m//g

    Esto elimina las secuencias ANSI restantes que establecen colores, etc.

Esto cubre todas las secuencias de control con las que normalmente me encuentro. Hay una gran variedad de secuencias de control extendidas y, si su salida tiene algunas que no he visto, es posible que sea necesario extender el código.

POSIX o BSD sed

En un sistema BSD o POSIX, los comandos individuales deben encadenarse junto con las opciones -e lugar de los puntos y coma. Por lo tanto, intente:

 sed -e ':again' -e 's/[^\x08]\x08\x1b\[K//' -e 't again' -e 's/\x1b_[^\x1b]*\x1b[\]//g' -e 's/\x1B\[[^m]*m//g' 

La respuesta sugerida que usa “sed-r” depende de GNU sed, lo que hace que no sea realmente portátil. Es posible hacer la misma funcionalidad con POSIX sed, pero de manera diferente: POSIX no permite pasar un script completo en una opción de comando como se muestra aquí. Eso significa que la forma (POSIX) de implementar un bucle estaría en un archivo separado, pasado a sed usando la opción “-f”. Del mismo modo, las constantes hexadecimales no son portátiles. Después de realizar estos cambios, se puede usar un script funcionalmente equivalente en los BSD y sistemas Unix.

La respuesta sugerida tampoco cubre algunos de los usos de los retornos de transporte que son bastante comunes (por ejemplo, en la salida de yum), ni filtra la “mayoría” de las secuencias ANSI (ya que se centra en el carácter final “m” de SGR). Finalmente, se refiere a

 escape _ text _ 

como una extensión xterm. Pero xterm no proporciona dicha extensión, porque los dos caracteres “escape” y “_” comienzan una secuencia de comando del progtwig de aplicación (y xterm no implementa ninguno).

El script sed resultante se ve así (“^ [” es el carácter de escape):

 s/^[[[][<=>?]\{0,1\}[;0-9]*[@-~]//g s/^[[]][^^[]*^G//g s/^[[]][^^[]*^[\\//g :loop s/[^^H]^H\(.\)/\1/g t loop s/^M^M*$//g s/^.*^M//g s/^[[^[]//g 

Un script más completo, llamado “script2log” se puede encontrar aquí . Sin embargo, hay cosas (como CSI K) que no son adecuadas para un script sed.