Je peux utiliser la commande "script" pour enregistrer une session interactive en ligne de commande. Cependant, cela inclut tous les caractères de contrôle et codes couleurs. Je peux supprimer les caractères de contrôle (comme le retour arrière) avec "col -b", mais je ne trouve pas de moyen simple de supprimer les codes de couleur.
Notez que je veux utiliser la ligne de commande de manière normale, donc je ne veux pas y désactiver les couleurs - je veux juste les supprimer de la sortie du script. De plus, je sais que je peux jouer et essayer de trouver une expression rationnelle pour arranger les choses, mais j'espère qu'il existe une solution plus simple (et plus fiable - et s'il y a un code que je ne connais pas lorsque je développe l'expression rationnelle ?).
Pour afficher le problème :
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
Réponse acceptée :
Le script suivant doit filtrer toutes les séquences de contrôle ANSI/VT100/xterm pour (basé sur ctlseqs). Testé au minimum, veuillez signaler toute sous- ou sur-correspondance.
#!/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;
}
Problèmes connus :
- Ne se plaint pas des séquences malformées. Ce n'est pas à cela que sert ce script.
- Les arguments de chaîne multiligne pour DCS/PM/APC/OSC ne sont pas pris en charge.
- Les octets compris entre 128 et 159 peuvent être analysés en tant que caractères de contrôle, bien que cela soit rarement utilisé. Voici une version qui analyse les caractères de contrôle non-ASCII (cela modifiera le texte non-ASCII dans certains encodages, y compris 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;
}