Mohu použít příkaz „script“ k záznamu interaktivní relace na příkazovém řádku. To však zahrnuje všechny řídicí znaky a barevné kódy. Mohu odstranit řídicí znaky (jako backspace) pomocí „col -b“, ale nemohu najít jednoduchý způsob, jak odstranit barevné kódy.
Všimněte si, že chci používat příkazový řádek normálním způsobem, takže tam nechci deaktivovat barvy – chci je pouze odstranit z výstupu skriptu. Také vím, že si mohu pohrát a zkusit najít regexp, abych věci napravil, ale doufám, že existuje jednodušší (a spolehlivější – co když existuje kód, o kterém při vývoji regulárního výrazu nevím?) řešení.
Pro zobrazení problému:
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
Přijatá odpověď:
Následující skript by měl odfiltrovat všechny řídicí sekvence ANSI/VT100/xterm pro (na základě ctlseq). Minimálně testováno, nahlaste prosím jakoukoli nedostatečnou nebo nadměrnou shodu.
#!/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;
}
Známé problémy:
- Nestěžuje si na chybně tvarované sekvence. K tomu tento skript není.
- Víceřádkové řetězcové argumenty pro DCS/PM/APC/OSC nejsou podporovány.
- Bajty v rozsahu 128–159 lze analyzovat jako řídicí znaky, i když se to používá zřídka. Zde je verze, která analyzuje řídicí znaky jiné než ASCII (v některých kódováních, včetně UTF-8, dojde k porušení textu jiného než ASCII).
#!/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;
}