Perl 将脚本(1)输出中的控制字符翻译为sed
我正在使用Perl 将脚本(1)输出中的控制字符翻译为sed,perl,bash,sed,Perl,Bash,Sed,我正在使用脚本命令录制终端会话。不幸的是,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 qu
脚本
命令录制终端会话。不幸的是,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控制字符
我在中发现了一个perl脚本,它可以从typescript中删除这些控制字符。
实际上,我是用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 ' -~\n\t' < typescript > typescript_printable_ascii_only
LC\u ALL=C tr-cd'-~\n\t'typescript\u可打印\u仅限ascii\u
为什么会这样?所有可打印(“正常”)ascii都在空格和波浪之间
此外,您还需要换行符和制表符。
因此,'-~\n\t'
覆盖了所有可打印的“普通”ascii字符。而tr-d'chars'
删除所有字符,-c
取给定范围的相反值(因此除'chars'之外的所有字符)
=>这个
LC\u ALL=C tr-cd'-~\n\t'
删除了除正常ascii字符(包括换行符和制表符)以外的所有字符(我强制区域设置为“C”,以确保调用“tr”时使用的是正确的区域设置)这对我使用GNU-sed(或Mac上的gsed
非常有效:
我创建了一个示例typescript,因为我使用了一个相对高级的shell提示符,它充满了控制字符,而OP中的perl
脚本实际上不起作用,所以我不得不自己设计,而不是转换
查看带有
hextump-C
的typescript,似乎所有控制序列都以\x1b
(转义字符,或^[
)开头,并以字母“m”结尾。因此在sed
中,我使用了^[
直到m
,通常写为\x1b.*m
,但由于sed
不支持?
符号使图案不贪婪,我使用了[^m]*m
来模拟非贪婪匹配。请计算输入是什么,当前输出是什么,期望输出是什么,最重要的是,问题是什么?太多的控制字符不是一个描述性问题。我发现perl one liner与col-b相结合,比其他提交的解决方案做得更好例如,如果VI编辑…您可能希望保留一些ctrl字符。您可以执行cat-ve typescript
来尝试确定所需的字符,并将它们添加到tr范围内,以便保留它们。以八进制输入它们,并在前面加上反斜杠:\abc
(例如:\377
,或\011
)啊,真的:我的tr
只会去掉转义码,剩下的就剩下了……对不起,最好完全匹配那些转义码。
sed -re 's/\x1b[^m]*m//g' typescript | col -b