0

バックティックを実行した出力からファイル名だけを取得しようとしているという問題があります。私のコードは次のとおりです。

$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

ysth ごとに修正:

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

3 に答える 3

0

出力の最終行で、ファイル名が括弧で囲まれた MIME タイプの前のスペースの前にあると仮定します。

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

私はむしろ一時ディレクトリを作成し(File::Tempを使用)、その中で解凍し、出力を解析するよりもそこにあるファイルを探すだけです。

File Exists 警告が実際には$varになくても、出力に表示される可能性があります。これは、munpack がそれを stderr に書き込んでいるためです (これは、バッククォートによってキャプチャされません)。 または を実行してみてmunpack -q -f ...くださいmunpack -f ... 2>/dev/null

于 2013-06-21T16:58:52.603 に答える
0

ファイル名の後に括弧で囲まれた説明が続くと想定できる場合、次のように機能します。

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

\m修飾子は、文字列を複数行の 1 つとして処理するため、任意の行で一致さ^せる$ことができます。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 に答える