元のメールからファイル名を解析する

元のメールからファイル名を解析する

電子メールでカンマ区切りのファイル名のリストを受け取る必要があります。以下は、1に特殊文字がたくさん含まれているいくつかの入力例です。

Content-Disposition: attachment;
        filename="How-To_21_Monitor_Mode_Deployment_Guide.pdf"; size=3886046;
        creation-date="Fri, 27 Oct 2017 16:23:20 GMT";
        modification-date="Fri, 27 Oct 2017 16:24:30 GMT"

Content-Disposition: attachment; filename="How-To_24_Low_Impact_Mode.pdf";
        size=6714113; creation-date="Fri, 27 Oct 2017 16:23:20 GMT";
        modification-date="Fri, 27 Oct 2017 16:24:31 GMT"

Content-Disposition: attachment;
        filename="SBTGxYVWPE1wI9SAjl5b2PUfF1LCjbU3aChsoch5eXuI4GrIP9bRhfiaOuwL1U
 ;.,~!@#$%....txt"; size=3966; creation-date="Fri, 27 Oct 2017 16:23:20 GMT";
        modification-date="Fri, 27 Oct 2017 16:23:20 GMT"

この方法は機能しますが、3行以上であれば効率的ではありません。

grep --no-group-separator --line-buffered -A 2 '^Content-Disposition: ' | sed -e '/\;$/!{N;s/\n//}' -n -e 's/.*filename\=//p' | sed -e 's/ size\=.*//' | sed 's/\;$//' | sed ':a;N;$!ba;s/\n/,/g'

単一のsedラインで動作しようとしています。

sed -n '/^Content-Disposition: /,/\"\; size\=/{/\;$/!{x;N;s/\n//g}};s/.*filename\=//p;s/ size\=.*//;s/\;$//;:a;N;$!ba;s/\n/,/g;

sedを単一のコマンドとして使用する方が良い場合は、大変感謝します。

ベストアンサー1

葛里の言葉が正しい。以下は、ファイルに完全な電子メールメッセージがあると仮定するクイックPerlスクリプトです。

cpan install Email::MIME File::Slurp::Tiny
perl -MEmail::MIME -MFile::Slurp::Tiny=read_file -wE '
    my $email = Email::MIME->new( read_file(shift @ARGV) );
    my $count = 0;
    $email->walk_parts(sub {
        my $part = shift;
        my %header = $part->header_str_pairs;
        if (exists $header{"Content-Disposition"}) {
            my ($filename) = $header{"Content-Disposition"} =~ m/(?<=filename=")([^"]+)/;
            say ++$count .":". $filename;
        }
    })
' email.eml

おすすめ記事