2015-03-07 4 views
0

У меня есть следующий текст (получил по электронной почте):Как разобрать текст сообщения электронной почты (Баш)

----boundary_3_f515675d-c033-4705-a01e-244d1d6c8368 
Content-Type: text/plain; charset=iso-8859-1 
Content-Transfer-Encoding: quoted-printable 

=0D=0ANew Lead from X Akows kl iut Sop=0D=0A=0D=0AName:=0D=0A Mic= 
hael Knight=0D=0A =0D=0AEmail Address:=0D=0A <a href=3D"mailto:mi= 
[email protected]">[email protected]</a>=0D=0A =0D=0ATelephon= 
e:=0D=0A 00447783112974=0D=0A =0D=0AComments:=0D=0A Please send = 
over more details =0D=0A=0D=0BBIOTS Reference:=0D=0A CV1614218=0D=0A= 
=0D=0AYour Ref:=0D=0A 12194-109543=0D=0A=0D=0AView Property:=0D=0A= 
http://abropetisd.placudmnsdwlmn.com/CV1614218 =0D=0A=0D=0A =0D=0A= 
----------------------------------------------------------------= 
---------------=0D=0A=0D=0APlease note: You may not pass these de= 
tails on to any 3rd parties.=0D=0AThis enquiry was sent to you by= 
X Akows kl iut Sop, txd UK?s #1 klsue fus kwhesena luhdsnry. Vi= 
sit www.placudmnsdwlmn.com for more information.=0D=0AQuestions? = 
Email [email protected]=0D=0A 
----boundary_3_f515675d-c033-4705-a01e-244d1d6c8368 

Я хочу, чтобы разобрать его, чтобы получить определенную информацию.

мне нужно:

Name: 
Email Address: 
Telephone: 
Comments: 
Reference: 
Your Ref: 
View Property: 

Как я могу извлечь эту информацию с помощью "Баш"?

+0

Что вы пробовали? Я бы не использовал 'bash'. Я бы использовал скриптовый язык, например 'perl' или' awk' ... – lurker

+0

Я пробовал awk, но я просто не могу заставить его работать! –

+0

Возможно, вы можете показать, что вы пробовали, и вы можете получить от него помощь. – lurker

ответ

3

Хорошо, я буду кусать. Данные цитируются для печати, и нам нужна версия с открытым текстом. Итак, давайте использовать Perl, у которого уже есть код для этого.

#!/usr/bin/perl 

use strict; 
use PerlIO::via::QuotedPrint; 

# Open input file through quoted-printable filter  
$ARGV[0] ne "" or die "No file specified"; 
open(IN, '<:via(QuotedPrint)', $ARGV[0]) or die "Could not open file"; 

# needles to search in the haystack. 
my @needles = ('Name', 
       'Email Address', 
       'Telephone', 
       'Comments', 
       'Reference', 
       'Your Ref', 
       'View Property'); 

my $line; 
my $key = ""; 

# handle the file linewise. 
foreach $line (<IN>) { 

    # The data we want is always one line after the 
    # key line, so: 

    # If we remember a key 
    if($key ne "") { 
     # print key and line, reset key variable. 
     print "$key =$line"; 
     $key = ""; 
    } else { 
     # otherwise, see if we find a key in the current line. 
     # If so, remember it so that the data in the next line 
     # will be printed. 
     my $n; 
     foreach $n (@needles) { 
      if(index($line, $n) != -1) { 
       $key = $n; 
       last; 
      } 
     } 
    } 
} 

Поместите это в файле, скажем extract.pl, chmod +x, и запустить ./extract.pl yourfile.

+0

Гений! Спасибо! –

+0

Красиво сделано. Похоже, что в каждой строке ожидается максимум 1 ключ, поэтому, возможно, поместите 'last;' after' $ key = $ p', чтобы завершить цикл после того, как найден ключ. Наконец, каламбур (и это действительно так): «pattern» предлагает регулярное выражение (или шаблон глобуса), но вы ищете строку _literals_ (которую вы назвали «ключ» при поиске совпадения). – mklement0

+0

«Последний;» - хорошая точка; Я не знаю, почему я оставил его в первую очередь. Что касается шаблонов, давайте перейдем с иглами (как показано в стоге сена). – Wintermute

1

Прежде всего, спасибо вам за помощь.

Я нашел другой способ сделать это, и я хотел бы опубликовать его здесь.

sed -e 's/=C2=A0/ /g' abc.txt | perl -pe 'use MIME::QuotedPrint; $_=MIME::QuotedPrint::decode($_);' | grep "^Interested in:" | cut -d' ' -f3- 

sed -e 's/=C2=A0/ /g' abc.txt | perl -pe 'use MIME::QuotedPrint; $_=MIME::QuotedPrint::decode($_);' | grep "^Name:" | cut -d' ' -f2- 

Я не знаю, почему, но исходный текст, содержащийся «= C2 = A0», который, кажется, так же, как « ». Поэтому я просто использовал «sed», чтобы вырезать их.

С уважением,

Neil.

 Смежные вопросы

  • Нет связанных вопросов^_^