【问题标题】:Extract e-mail addresses if they contain certain strings with Perl使用 Perl 提取包含特定字符串的电子邮件地址
【发布时间】:2013-06-01 17:05:23
【问题描述】:

我有一个大文本文件,它是一个电子邮件列表(每个都跟一个 /n)。

我想运行一个 perl 命令来根据电子邮件是否包含某个字符串来制作具有不同列表的文件。

到目前为止我有:

 perl -wne'
    while (/[\w\.\-]+@[\w\.\-]+\w+/g) {
       print if "$&\n /gmail/;
    }
 ' all_emails_extracted.csv | sort -u > output.txt

如果它包含“gmail”,这应该写电子邮件,但无论我如何构造 {print if} 周围的区域,我都会遇到语法错误

【问题讨论】:

    标签: string perl email text-extraction


    【解决方案1】:

    正常

    print "$&\n";
    

    所以如果你添加一个语句修饰符,它就变成了

    print "$&\n" if /gmail/;
    

    您缺少报价 ("),并且您的 if 放错了位置。


    简单一点:

    perl -nE'say grep /gmail/, /[\w\.\-]+@[\w\.\-]+\w+/g'
    

    您甚至可以在 Perl 本身中进行重复数据删除。

    perl -MList::MoreUtils=uniq -nE'say uniq grep /gmail/, /[\w\.\-]+@[\w\.\-]+\w+/g'
    

    【讨论】:

      【解决方案2】:

      你把这个复杂化了很多……

      perl -wne'print if /@.*gmail/' all_emails_extracted.csv
      

      或者,更简单(但没有 Perl):

      grep @.*gmail all_emails_extracted.csv
      

      【讨论】:

      • 两者都打印整行,而不仅仅是电子邮件地址。他们还可以匹配电子邮件地址之外的“gmail”一词。
      【解决方案3】:

      您的代码中的错误已经被指出,所以这里有另一个建议:使用Email::Address

      $ cat addresses
      bob@gmail.com
      bob@yahoo.com
      bobette@springfield-amusement-park.com
      bobbyMcBobberson@springfield-amusement-park.com
      bahb@yahoo.com
      bob @ yahoo.com
      bob @ springfield-amusement-park.com
      postmaster@hotmail.com
      
      $ perl -MEmail::Address -lne 'for (Email::Address->parse($_)) { $bobs{$_->format}++ if $_->user =~ /bob/i } END { print for sort keys %bobs }' addresses
      bob@gmail.com
      bob@springfield-amusement-park.com
      bob@yahoo.com
      bobbyMcBobberson@springfield-amusement-park.com
      bobette@springfield-amusement-park.com
      

      您说您想“制作具有不同列表的文件”?电子邮件::地址也可以提供帮助:

      while (<DATA>) {
        for (Email::Address->parse($_)) {
          push @{$categories{by_host}{$_->host}}, $_;
          push @{$categories{bobs}}, $_ if $_->user =~ /bob/i
        }
      }
      

      然后这将在以每个地址的主机名命名的文件中创建用户名列表:

      for my $host (keys $categories{by_host}) {
        open my $hf, '>', "hosts.$host" or die $!;
        for (@{$categories{by_host}{$host}}) {
          print {$hf} $_->user, "\n"
        }
        close $hf
      }
      

      所以,在最后一个列表上运行:

      $ cat hosts.springfield-amusement-park.com
      bobette
      bobbyMcBobberson
      bob
      
      $ cat hosts.yahoo.com
      bob
      bahb
      bob
      

      【讨论】:

        猜你喜欢
        • 2019-12-26
        • 2017-10-10
        • 2013-11-22
        • 1970-01-01
        • 2013-05-01
        • 2017-08-25
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多