String 使用Perl提取电子邮件地址(如果它们包含某些字符串)

String 使用Perl提取电子邮件地址(如果它们包含某些字符串),string,perl,email,text-extraction,String,Perl,Email,Text Extraction,我有一个大的文本文件,它是一个电子邮件列表(每个邮件后面都有a/n) 我想运行一个perl命令,根据电子邮件是否包含某个字符串生成具有不同列表的文件 到目前为止,我已经: perl -wne' while (/[\w\.\-]+@[\w\.\-]+\w+/g) { print if "$&\n /gmail/; } ' all_emails_extracted.csv | sort -u > output.txt 如果它包含“gmail”,那么应

我有一个大的文本文件,它是一个电子邮件列表(每个邮件后面都有a/n)

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

到目前为止,我已经:

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

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

您已经显著地过度复杂了

perl -wne'print if /@.*gmail/' all_emails_extracted.csv
或者,更简单(但没有Perl):


你把这件事搞得太复杂了

perl -wne'print if /@.*gmail/' all_emails_extracted.csv
或者,更简单(但没有Perl):

正常情况下

print "$&\n";
因此,如果添加语句修饰符,它将变为

print "$&\n" if /gmail/;
您缺少一个引号(
),如果您的
放错了位置,您的


简单一点:

perl -nE'say grep /gmail/, /[\w\.\-]+@[\w\.\-]+\w+/g'
您甚至可以用Perl本身进行重复数据消除

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

print "$&\n";
因此,如果添加语句修饰符,它将变为

print "$&\n" if /gmail/;
您缺少一个引号(
),如果您的
放错了位置,您的


简单一点:

perl -nE'say grep /gmail/, /[\w\.\-]+@[\w\.\-]+\w+/g'
您甚至可以用Perl本身进行重复数据消除

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

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

你说你想“用不同的列表制作文件”?电子邮件::地址也可以帮助解决这一问题:

while (<DATA>) {
  for (Email::Address->parse($_)) {
    push @{$categories{by_host}{$_->host}}, $_;
    push @{$categories{bobs}}, $_ if $_->user =~ /bob/i
  }
}
因此,请运行最后一个列表:

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

$ cat hosts.yahoo.com
bob
bahb
bob

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

你说你想“用不同的列表制作文件”?电子邮件::地址也可以帮助解决这一问题:

while (<DATA>) {
  for (Email::Address->parse($_)) {
    push @{$categories{by_host}{$_->host}}, $_;
    push @{$categories{bobs}}, $_ if $_->user =~ /bob/i
  }
}
因此,请运行最后一个列表:

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

$ cat hosts.yahoo.com
bob
bahb
bob

这两种方法都会打印整行内容,而不仅仅是电子邮件地址。它们还可以在电子邮件地址外匹配“gmail”一词。这两个词都可以打印整行内容,而不仅仅是电子邮件地址。他们还可以在电子邮件地址之外匹配“gmail”一词。