将删除脚本(1) 输出中的控制字符的 Perl 脚本转换为 sed



我正在使用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来模拟非贪婪匹配。

相关内容

  • 没有找到相关文章

最新更新