我有一个问题,我试图从运行反引号的输出中只提取一个文件名,我的代码如下:
$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'
答案 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;
}