2013-06-21 30 views
0

我在那裏我試圖從運行反引號的輸出拉只是一個文件名的問題拉只是文件名,我的代碼如下:試圖從反引號

$var = `munpack -f filename`; 

如果有人熟悉MPack,還將輸出將是這樣的:

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

我想只獲取文件名,但是,我所有嘗試的正則表達式都失敗了。我甚至試圖刪除換行符,然後嘗試處理這些信息,但我不能。我認爲他們可能只是空白,並刪除空白,但這些正則表達式失敗。我可以通過並列出每個我試圖提取這些數據的正則表達式,如果有必要,我可以提供這些數據,但也許有人可以使用某些東西。我無法以任何方式產生任何id,也不會改變輸出。所以,僅僅是明確的即時尋找的東西,將輸出我只是文件名前:file_20130620.zip

與輸出給出了一些建議:每YSTH

$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

爲什麼不只是grep的文件名的原始MIME文本?它會在那裏的某個地方。 –

+0

'foo =(command); $ foo =〜s /.* \ W(\ w + \。zip)。*/$ 1/s; print $ foo' – Kevin

+0

@Kevin如果我只使用這個方法:tempdesc.txt:文件存在出現在$ foo中。 – Kizzim

回答

0

假設文件名是輸出的最後一行帶括號的MIME類型前的空格前:

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

雖然我寧願創建一個臨時目錄(使用File :: Temp),然後解壓縮它,然後只是查找那裏的文件,而不是解析輸出。

這可能是該文件存在警告實際上不是$var,而是出現在你的輸出,因爲munpack正在寫它標準錯誤(不得到由反引號捕獲。) 嘗試做munpack -q -f ...munpack -f ... 2>/dev/null

+0

這將刪除:(application/octet-stream),但是,tempdesc.txt:文件仍然存在。 – Kizzim

+0

如果在'$ var'中,我的正則表達式會跳過它;我懷疑你做錯了什麼。請顯示'use Data :: Dumper; $數據::自卸車:: Useqq = $數據::自卸車::簡潔= 1;打印Dumper $ var;打印Dumper $文件名;'(在我的答案代碼後) – ysth

+0

tempdesc.txt:文件存在 「file_20130620.zip(application/octet-stream)\ n」 「file_20130620.zip」 – Kizzim

0

如果可以假設文件名後面帶括號的說明,像這樣的工作:

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

\m修飾符把一個字符串作爲一個多行,這樣就可以在匹配^$任何線路。請參閱perlre

+0

如果我運行這個輸出是:tempdesc.txt:文件存在 file_20130620.zip。它只會從最後一行刪除(application/octet-stream)。 – Kizzim

+0

你可以通過'od'運行輸出:'munpack -f filename | od -xa'併發布? – JRFerguson

+0

tempdesc.txt:文件存在 0。 z我p sp – Kizzim

0

我把您的示例輸出到file1.txt,因爲我沒有安裝mpack實用程序。 而這個正則表達式工作

#!/usr/bin/perl 

my $var = `more file1.txt`; 

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

如果我運行這個代碼,我收到的輸出是:tempdesc.txt:文件存在 – Kizzim

+1

你可能想要貓,而不是更多。 – ysth