试图从反引号中提取文件名

时间:2013-06-21 16:42:10

标签: perl

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

$var = `munpack -f filename`;

如果有人熟悉mpack,输出将是:

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

我正在尝试获取文件名,但是,我尝试的所有正则表达式都失败了。我甚至试图删除换行符,然后尝试处理信息,我不能。我认为他们可能只是空白并删除空白,但那些正则表达式失败了。我可以通过列出我试图提取这些数据的每个正则表达式,如果有必要,我可以提供,但也许有人可以使用。我不能以任何方式产生任何类似的匹配或改变输出的匹配。所以,为了清楚我正在寻找一些东西,只输出我的文件名ex: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'

3 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

如果您可以假设文件名后跟带括号的描述,则可以使用以下内容:

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

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

答案 2 :(得分:0)

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

#!/usr/bin/perl

my $var = `more file1.txt`;

if($var =~/\S+: [^\n]+\n(\S+) [^\n]+\n/)
{
    printf $1;
}