2013-12-02 1 views
-3

Ive получил файл, содержащий много адресов электронной почты, IP-адрес и даты. Мне нужно написать perl-скрипт для чтения в файле, использовать выражение регулярного выражения для обнаружения каждого из них и вывода их в другой файл.Запись адресов электронной почты в файл из файла с использованием регулярного выражения в perl

выражения рег я являются:

Email = /[A-Z0-9._%+-][email protected][A-Z0-9.-]+\[A-Z]{2,4}/g

Ip адрес = \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

Date = [0-9]{2}/[Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec]/[0-9]{4}

Im интересно, если это правильно, и если кто-то может помочь мне поставить их в perl-скрипт.

Сценарий я написал для писем является:

#!/usr/bin/perl 

open(IN, "<Assignment2.rtf") || die("file not found"); 
#chooses the file to read 
open(OUT, ">emailaddresses.txt"); 
#prints file 

$line = <IN>; 
$none = "No email addresses found!"; 
for ($line) 
{ 
    if ($line =~ /[A-Z0-9._%+-][email protected][A-Z0-9.-]+\[A-Z]{2,4}/g) 
    { 
     print (OUT $line); 
    } 
    else 
    { 
     print (OUT $none); 
    } 
} 

close(IN); 
close(OUT); 

Он будет собирать, но не будут работать. Остальные выражения не будут компилировать

Благодарности

+3

Электронная почта намного сложнее, чем это. http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html. IP-адрес будет иметь адрес 999.88.77.666, который является недопустимым. Дата, на которую дана дата 82/Dec/2013. Вы можете найти https://metacpan.org/pod/Regexp::Common полезным. Тем не менее, это не «писать коды» для меня на сайте - вы должны взломать его сами и задать конкретные проблемы о проблемах, которые вы найдете. – Oesor

+0

[Прекратить проверку адресов электронной почты с помощью регулярных выражений] (http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/). –

ответ

0

Вы должны использовать группировку скобки:

perl -ne 'if (/((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sept|Oct|Nov|Dec]) \d{2}).*([A-Z0-9._%+-]+\@[A-Z0-9.-]+[A-Z]{2,4})/i) {print $1." ".$2."\n"}' < /var/log/maillog-20131201 # something alike 

Обратите внимание на (?:) обозначении, для избежания вспоминая матчи. Возможно, вы захотите проверить perldoc perlre.

1

Regex::Common Рассмотрите возможность использования для ваших согласующих задач:

use strict; 
use warnings; 
use Regexp::Common qw/time net Email::Address/; 

while (<DATA>) { 
    chomp; 
    print qq/Date "$1" in "$_"\n/ if /($RE{time}{dmy})/; 
    print qq/IP "$1" in "$_"\n/ if /($RE{net}{IPv4})/; 

    my (@found) = map { s/^\s+//; $_ } /($RE{Email}{Address})/g; 
    print qq/Email "@found" in "$_"\n/ if @found; 
} 

__DATA__ 
01/Jan/2014 - Happy New Year! 
99/Feb/1999 
Send an email to: [email protected] 
ip: 999.555.111 
ip: 127.0.0.1 
198.252.206.16 on 02/Dec/2013 to [email protected] and [email protected] 

Выход:

Date "01/Jan/2014" in "01/Jan/2014 - Happy New Year!" 
Email "[email protected]" in "Send an email to: [email protected]" 
IP "127.0.0.1" in "ip: 127.0.0.1" 
Date "02/Dec/2013" in "198.252.206.16 on 02/Dec/2013 to [email protected] and [email protected]" 
IP "198.252.206.16" in "198.252.206.16 on 02/Dec/2013 to [email protected] and [email protected]" 
Email "[email protected] [email protected]" in "198.252.206.16 on 02/Dec/2013 to [email protected] and [email protected]" 

Надеется, что это помогает!

+1

Я написал это для писем. – Emma

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