翻译perl脚本删除脚本中的控制字符(1)输出到sed

时间:2013-12-30 09:52:55

标签: perl bash sed

我正在使用script命令录制终端会话。不幸的是,typescript输出文件包含许多控制字符 - 例如,在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控制字符。

我在commandlinefu中找到了一个perl脚本,它可以从打字稿中删除这些控制字符。 我实际上在C中进行了这个替换,并且该程序在chroot envrioment上运行,其中perl是不可用的。

问题:有没有办法将以下perl命令翻译为sed

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

2 个答案:

答案 0 :(得分:2)

如果您只想要可打印的ascii:

LC_ALL=C tr -cd ' -~\n\t' < typescript > typescript_printable_ascii_only

为什么会这样?所有可打印的(“普通”)ascii都在Space和Tilde之间 此外,您还需要Newline和Tab。 所以' -~\n\t'涵盖了所有可打印的“普通”ascii字符。 tr -d 'chars'删除所有字符,-c取与给定范围相反(所以除了'字符'之外的所有字符)。

=&GT;这个LC_ALL=C tr -cd ' -~\n\t'删除除了普通的ascii字符(包括换行符和制表符)之外的所有内容(我强制将语言环境设置为'C',以确保在调用“tr”时我们处于正确的语言环境中)

答案 1 :(得分:1)

这适用于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来模拟非贪婪的匹配。