Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 将脚本(1)输出中的控制字符翻译为sed_Perl_Bash_Sed - Fatal编程技术网

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