and*_*oke 80 colors terminal text-processing escape-characters typescript
我可以使用“脚本”命令在命令行记录交互式会话。但是,这包括所有控制字符和颜色代码。我可以使用“col -b”删除控制字符(如退格键),但找不到删除颜色代码的简单方法。
请注意,我想以正常方式使用命令行,所以不想在那里禁用颜色 - 我只想从脚本输出中删除它们。此外,我知道可以尝试并尝试找到一个正则表达式来解决问题,但我希望有一个更简单(更可靠 - 如果我在开发正则表达式时不知道代码怎么办?)解决方案。
要显示问题:
spl62 tmp:脚本 脚本启动,文件是打字稿 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 清理 doc-src test.ini spl62 lepl:退出 脚本完成,文件是打字稿 spl62 tmp: cat -v 打字稿 脚本开始于 2011 年 6 月 9 日星期四上午 09:47:27 CLT spl62 lepl: ls^M ^[[0m^[[00madd-licence.sed^[[0m ^[[00;32mbuild-example.sh^[[0m ^[[00mcommit-test^[[0m ^[[00;32mpush-docs.sh] ^[[0米^米 ^[[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: 退出^M 脚本完成于 2011 年 6 月 9 日星期四上午 09:47:29 CLT spl62 tmp: col -b < 打字稿 脚本开始于 2011 年 6 月 9 日星期四上午 09:47:27 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:退出 脚本完成于 2011 年 6 月 9 日星期四上午 09:47:29 CLT
Gil*_*il' 67
以下脚本应过滤掉所有 ANSI/VT100/xterm 控制序列(基于ctlseqs)。最低限度的测试,请报告任何匹配不足或过度匹配。
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
s/ \e[ #%()*+\-.\/]. |
\e\[ [ -?]* [@-~] | # CSI ... Cmd
\e\] .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
\e[P^_] .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
\e. //xg;
print;
}
Run Code Online (Sandbox Code Playgroud)
已知的问题:
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
s/ \e[ #%()*+\-.\/]. |
(?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
(?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
(?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
\e.|[\x80-\x9f] //xg;
print;
}
Run Code Online (Sandbox Code Playgroud)
小智 37
更新Gilles 的回答以删除回车符并对以前的字符进行退格擦除,这对于我在 Cygwin 上生成的打字稿都很重要:
#!/usr/bin/perl
while (<>) {
s/ \e[ #%()*+\-.\/]. |
\r | # Remove extra carriage returns also
(?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
(?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
(?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
\e.|[\x80-\x9f] //xg;
1 while s/[^\b][\b]//g; # remove all non-backspace followed by backspace
print;
}
Run Code Online (Sandbox Code Playgroud)
小智 16
我会sed在这种情况下使用:
cat -v typescript | sed -e "s/\x1b\[.\{1,5\}m//g"
Run Code Online (Sandbox Code Playgroud)
sed -e "s/search/replace/g"是标准的东西。正则表达式解释如下:
\x1b 匹配颜色代码之前的 Escape\[ 匹配第一个左括号.\{1,5\}匹配任何单个字符的 1 到 5 个。必须\使用花括号以防止外壳损坏它们。m 正则表达式中的最后一个字符 - 通常跟踪颜色代码。// 用于替换所有内容的空字符串。g 每行匹配多次。Mar*_*nas 12
Ubuntu 上ansi2txt的colorized-logs软件包中有一个命令。它很好地删除了 ANSI 颜色代码,但它不处理诸如通过发射产生的进度条^H或^M字符覆盖文本之类的事情。 col -b可以处理这些,因此为了获得最佳结果,您可以将两者结合起来
cat typescript | ansi2txt | col -b
Run Code Online (Sandbox Code Playgroud)
小智 10
cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed
Run Code Online (Sandbox Code Playgroud)
# The "sed -r" trick does not work on every Linux, I still dunno why:
DECOLORIZE='eval sed "s,${END}\[[0-9;]*[m|K],,g"'
Run Code Online (Sandbox Code Playgroud)
=> 使用方法:
<commands that type colored output> | ${DECOLORIZE}
Run Code Online (Sandbox Code Playgroud)
测试: - AIX 5.x / 6.1 / 7.1 - Linux Mandrake / Mandriva / SLES / Fedora - SunOS