원본 이메일에서 파일 이름 구문 분석

원본 이메일에서 파일 이름 구문 분석

이메일에서 쉼표로 구분된 파일 이름 목록을 받아야 합니다. 다음은 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

답변2

이메일에서 쉼표로 구분된 파일 이름 목록 받기

암소 비슷한 일종의 영양해결책:

awk -v RS='\n\n' 'BEGIN{ fn="" }
       match($0, /filename="([^"]+)";[[:space:]]+size=/, a){ 
           gsub(/[[:space:]]*/, "", a[1]); 
           fn = (fn!=""? fn", ":"")a[1] 
       }END{ print fn }' file
  • fn- 모든 파일 이름을 포함하는 결과 문자열(처리 후)

  • -v RS='\n\n'- 레코드 구분 기호를 이중 줄 바꿈으로 설정

  • /filename="([^"]+)";[[:space:]]+size=/- 정규식 패턴은 각 헤더의 파일 이름을 Content-Disposition일치하는 배열로 캡처합니다.a


산출:

How-To_21_Monitor_Mode_Deployment_Guide.pdf, How-To_24_Low_Impact_Mode.pdf, SBTGxYVWPE1wI9SAjl5b2PUfF1LCjbU3aChsoch5eXuI4GrIP9bRhfiaOuwL1U;.,~!@#$%....txt

답변3

RomanPerekhrest가 99%에 도달했습니다. 감사합니다! 이것은 파일 이름의 공백을 처리하고 문자열 주위에 따옴표를 포함하기 위해 몇 가지 사소한 조정만 수행한 마지막 줄입니다. 이 경우 awk는 확실히 sed보다 낫습니다.

awk -v RS='\n\n' 'BEGIN{ fn="" } match($0, /filename=("[^"]+");[[:space:]]+size=/, a) {gsub(/\n/, "", a[1]);fn = (fn!=""? fn",":"")a[1]}END{ 인쇄 fn }'

관련 정보