我有一个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;
...
...
}
即使使用$line
,上述chomp
也包含垃圾字符。我已经尝试将输出重定向到文件并从文件中读取,但即使文件中也包含垃圾/垃圾字符。
执行上述命令的示例输出:
^[[H^[[Jtotal 12
drwx------ 2 root root 4096 Dec 19 15:30 tad4d
drwx------ 2 root root 4096 Jan 2 15:37 oup
-rw-r--r-- 1 root root 137 Jan 9 06:25 alth.txt
在上面的输出中,在total 12
之前,存在一些垃圾字符。
由于
答案 0 :(得分:2)
1 - 在不知道命令的情况下无法回答。如果它是ls
你不应该解析ls
,但你表明你不是。^[[H^[[J
。使用您输入的示例输入:$PS1
- 是一个转义码,用于终端中的颜色等内容。请参阅:Control Sequences -
此可能来自您的提示。检查shell中open ( my $output, '-|', 'ls', '-ltr' );
while ( <$output> ) {
print;
}
的设置。但是那里有一个涉及绕过shell的解决方法:
s/[^\w\s]+//g
这样你就不会在处理过程中涉及shell,所以任何'垃圾'都直接来自你正在运行的命令。
请参阅:perlfaq
2 - 修复命令以不生成“垃圾”。我不能更具体,因为我不知道你的意思。但是通过正则表达式来运行它以过滤掉特定的“垃圾”字符是非常可行的。例如。 open
将过滤掉不是字母和空格的任何内容。虽然注意 - 这会删除标点符号,但您可以通过阅读perlre
在你的例子中 - 因为它是转义代码 - 你不仅仅获得控制代码,而是获取转义序列。这可能对过滤器来说更加烦人,因为它们没有固定的长度。但也许这会有所帮助:Best way to remove ANSI color escapes in Unix
我指出使用词法文件句柄作为补充 - 3参数.otherwise({
class: 'page-not-found',
title: '404 Page Not Found',
description: '404 Page Not Found',
templateUrl: '/app/static/404.html',
controller: 'mainController as mainCtrl'
});
是一种很好的做法,并避免了一些问题。
答案 1 :(得分:1)
您已将shell配置为在启动时调用clear
。这些字符由clear
发出,用于指示终端归位光标并清除自身。您应该限制调用clear
来登录shell和/或交互式shell。