从脚本输出中删除控制字符(包括控制台代码/颜色)

从脚本输出中删除控制字符(包括控制台代码/颜色)

我可以使用“script”命令在命令行记录交互式会话。但是,这包括所有控制字符颜色代码。我可以使用“col -b”删除控制字符(如退格键),但我找不到删除颜色代码的简单方法。

请注意,我想以正常方式使用命令行,所以不想在那里禁用颜色 - 我只想从脚本输出中删除它们。另外,我知道可以尝试找到一个正则表达式来解决问题,但我希望有一个更简单(也更可靠 - 如果在开发正则表达式时有一个我不知道的代码怎么办?)解决方案。

显示问题:

spl62 tmp:脚本
脚本已启动,文件为打字稿
spl62 lepl: ls
add-licence.sed build-example.sh 提交测试 Push-docs.sh
add-licence.sh build.sh 删除-licence.sed setup.py
asn build-test.sh 删除-licence.sh src
build-doc.sh 清理 doc-src test.ini
spl62 lepl:退出
脚本完成,文件是打字稿
spl62 tmp:cat -v 打字稿
脚本开始于 2011 年 6 月 9 日星期四 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] ^[[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 AM CLT 完成
spl62 tmp: col -b < 打字稿
脚本开始于 2011 年 6 月 9 日星期四 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:退出

脚本于 2011 年 6 月 9 日星期四 09:47:29 AM CLT 完成

答案1

以下脚本应过滤掉所有 ANSI/VT100/xterm 控制序列(基于ctseqs)。经过最低程度的测试,请报告任何匹配不足或过度的情况。

#!/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;
}

已知的问题:

  • 不抱怨格式错误的序列。这不是这个脚本的目的。
  • 不支持 DCS/PM/APC/OSC 的多行字符串参数。
  • 128-159 范围内的字节可以被解析为控制字符,尽管很少使用。这是一个解析非 ASCII 控制字符的版本(这会破坏某些编码中的非 ASCII 文本,包括 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\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
    print;
}

答案2

更新中吉尔斯的回答还可以删除回车符并对先前的字符进行退格擦除,这对于在 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;
}

答案3

有一个ansi2txtcolorized-logsUbuntu 上的包中的命令。它很好地删除了 ANSI 颜色代码,但它不处理诸如通过发射产生的进度条^H^M覆盖文本的字符之类的事情。 col -b可以处理那些,因此为了获得最佳结果,您可以将两者结合起来

cat typescript | ansi2txt | col -b

答案4

cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed

相关内容