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