我正在使用script
命令记录终端会话。不幸的是,打字稿输出文件包含许多控制字符 - 例如在 vim 编辑器中按全屏命令 (F11) 或在下面尝试。
script -f -t 2>${LOGNAME}-$(/bin/date +%Y%m%d-%H%M%S).time -a ${LOGNAME}-$(/bin/date +%Y%m%d-%H%M%S).session
vi abc.log
#write something and save
#:x to quit vi
ctrl + d to quit script
脚本输出hostname-datetime.session
包含太多 vi 控制字符。
我在命令行中找到了一个perl脚本,它可以从打字稿中删除这些控制字符。我实际上正在用 C 语言进行这种替换,并且该程序在 chroot 环境中运行,其中 perl 不可用。
问:有没有办法将以下perl
命令转换为sed
?
cat typescript | perl -pe 's/e([^[]]|[.*?[a-zA-Z]|].*?a)//g' | col -b > typescript-processed
如果你只想要可打印的ascii:
LC_ALL=C tr -cd ' -~nt' < typescript > typescript_printable_ascii_only
为什么会这样? 所有可打印("正常")ASCII 都介于空格和波浪号之间此外,您还需要换行符和制表符。因此,' -~nt'
涵盖了所有可打印的"普通"ASCII字符。tr -d 'chars'
删除所有字符,-c
取与给定范围相反的字符(因此除"字符"之外的所有字符)。
=> 此LC_ALL=C tr -cd ' -~nt'
删除除普通 ascii 字符(包括换行符和制表符)之外的所有内容(我强制将区域设置设置为"C"以确保我们在调用"tr"时处于正确的区域设置")
对我来说很适用于GNU sed(或Mac上的gsed
):
sed -re 's/x1b[^m]*m//g' typescript | col -b
我创建了一个示例打字稿,由于我使用的是相对高级的 shell 提示符,它充满了控制字符,并且 OP 中的perl
脚本实际上不起作用,所以我不得不想出自己的而不是转换。
查看带有hexdump -C
的打字稿,似乎所有控制序列都以x1b
(转义字符或^[
)开头,并以字母"m"结尾。所以在sed
我使用从^[
到m
的简单替换,通常写成x1b.*?m
但由于sed
不支持?
符号使模式不贪婪,我使用[^m]*m
来模拟非贪婪匹配。