从perl脚本执行的Shell命令包含垃圾字符
我有一个perl脚本,它运行shell命令并解析输出,如下所示:从perl脚本执行的Shell命令包含垃圾字符,perl,Perl,我有一个perl脚本,它运行shell命令并解析输出,如下所示: # Using ls -ltr for illustration. Actual command is different. my $cmd = "ls -ltr 2>&1 | "; open (CMD, $cmd ) || die "Cant run $cmd"; while (my $line = <CMD>) { chomp $line; ... ... } 在上述输出中,total
# Using ls -ltr for illustration. Actual command is different.
my $cmd = "ls -ltr 2>&1 | ";
open (CMD, $cmd ) || die "Cant run $cmd";
while (my $line = <CMD>) {
chomp $line;
...
...
}
在上述输出中,total 12
之前,存在一些垃圾字符
谢谢1-在不知道命令的情况下无法回答。如果它是
ls
,您不应该解析ls
,但您指出您不是。对于您给出的示例输入:^[[H^[[J
-是一个转义码,用于终端中的颜色等内容。请参阅:-
这可能来自您的提示。请检查shell中的$PS1
设置。但有一个解决方法涉及绕过shell:
open ( my $output, '-|', 'ls', '-ltr' );
while ( <$output> ) {
print;
}
open(我的$output,'-|','ls','-ltr');
而{
印刷品;
}
这样,您就不会让shell参与处理,因此任何“垃圾”都直接来自您正在运行的命令
见:
2-修复命令以不生成“垃圾”。我不能说得更具体,因为我不知道你的意思。但是通过正则表达式运行它以过滤掉特定的“垃圾”字符是完全可行的。例如,s/[^\w\s]+//g
将过滤掉任何不是字母数字和空格的内容。虽然注意-这将删除标点符号,但您可以通过阅读找出更合适的示例
但在您的示例中-因为是转义码-您得到的不仅仅是控制码,而是转义序列。这可能更讨厌过滤,因为它们没有固定的长度。但这可能会有帮助:
作为补充-3参数,我要指出使用词法文件句柄
open
是一种很好的做法,可以避免一些错误。1-在不知道命令的情况下无法回答。如果它是ls
,你不应该解析ls
,但你指出你不是。通过你给出的示例输入:^[[H]^[[J
-是一种转义码,用于终端中的颜色。请参阅:-
这可能来自您的提示。请检查shell中的$PS1
设置。但有一个解决方法涉及绕过shell:
open ( my $output, '-|', 'ls', '-ltr' );
while ( <$output> ) {
print;
}
open(我的$output,'-|','ls','-ltr');
而{
印刷品;
}
这样,您就不会让shell参与处理,因此任何“垃圾”都直接来自您正在运行的命令
见:
2-修复命令以不生成“垃圾”。我不能说得更具体,因为我不知道你的意思。但是通过正则表达式运行它以过滤掉特定的“垃圾”字符是完全可行的。例如,s/[^\w\s]+//g
将过滤掉任何不是字母数字和空格的内容。虽然注意-这将删除标点符号,但您可以通过阅读找出更合适的示例
但在您的示例中-因为是转义码-您得到的不仅仅是控制码,而是转义序列。这可能更讨厌过滤,因为它们没有固定的长度。但这可能会有帮助:
作为一个补充-3参数,我要指出使用词法文件句柄打开是一个很好的做法,可以避免一些问题。您已经将shell配置为在每次启动时调用
清除。这些字符由清除发出,以指示您的终端返回光标并清除自身。您应该限制调用clear
登录shell和/或交互式shell。您已将shell配置为在每次启动时调用clear
。这些字符由clear
发出,以指示您的终端返回光标并清除自身。您应限制调用clear
登录shell和/或interactive shell。需要一个“垃圾”示例才能回答。添加了一个示例输出!!^[/code>是一个转义代码。您是否配置了提示,特别是带有颜色的提示?(echo$PS1
应该告诉您)^[[H^[/J
是垃圾我需要一个“垃圾”示例为了能够回答。添加了一个示例输出!!^[/code>是一个转义码。您是否配置了提示,尤其是带有颜色的提示?(echo$PS1
应该告诉您)^[[H]^[[J
是垃圾am gettingPrompt在使用-c
时不使用,因此它不是来自提示符。可能来自写得不好的shell启动文件。这是由clear
发出的序列。使用-c
时不使用提示符,因此它不是来自提示符。可能来自写得不好的shell启动文件。这是是由清除发出的序列。