0

我有一个问题,我试图从运行反引号的输出中提取一个文件名,我的代码如下:

$var = `munpack -f filename`;

如果有人熟悉 mpack,输出将类似于:

tempdesc.txt: File exists
file_20130620.zip (application/octet-stream)

我试图只获取文件名,但是,我所有尝试的正则表达式都失败了。我什至尝试删除换行符,然后尝试处理信息,但我不能。我认为它们可能只是空格并删除空格,但那些正则表达式失败了。我可以浏览并列出我尝试提取此数据的每个正则表达式,如有必要,我可以提供,但也许有人有一些可以工作的东西。我无法生成任何 id 喜欢的匹配项,也无法以任何方式更改输出。因此,为了清楚起见,我正在寻找可以输出文件名的东西,例如:file_20130620.zip

输出给出的一些建议:

$var =~ m{^(.+?)\(}m and print "$1\n";
output:
tempdesc.txt: File exists
file_20130620.zip 

($filename) = $var =~ /(?s:.*\n)?(.*) \([^)]+\)\n/;
output:
tempdesc.txt: File exists
file_20130620.zip 

if($var =~/\S+: [^\n]+\n(\S+) [^\n]+\n/) { printf $1; }
output:
tempdesc.txt: File exists

每次修复:

$var = `munpack -f filename 2>/dev/null`; #will remove 'tempdesc.txt: File exists'
4

3 回答 3

0

假设文件名在输出最后一行带括号的 mimetype 之前的空格之前:

($filename) = $var =~ /(?s:.*\n)?(.*) \([^)]+\)\n/;

虽然我宁愿创建一个临时目录(使用 File::Temp)并在其中解压缩并只查找那里的文件而不是解析输出。

File Exists 警告可能实际上不在 中$var,而是出现在您的输出中,因为 munpack 正在将其写入 stderr(它不会被反引号捕获。)尝试执行munpack -q -f ...or munpack -f ... 2>/dev/null

于 2013-06-21T16:58:52.603 回答
0

如果您可以假设文件名后跟带括号的描述,则如下所示:

$var =~ m{^(.+?)\(}m and print "$1\n";

修饰符将字符串视为具有多行的\m字符串,以便您可以在任何行上^进行匹配。$perlre

于 2013-06-21T17:03:15.157 回答
0

因为我没有安装 mpack 实用程序,所以我将您的示例输出放到 file1.txt 中。这个正则表达式有效

#!/usr/bin/perl

my $var = `more file1.txt`;

if($var =~/\S+: [^\n]+\n(\S+) [^\n]+\n/)
{
    printf $1;
}
于 2013-06-21T17:03:44.927 回答