Linux 打印匹配行下方的行

Linux 打印匹配行下方的行,linux,perl,Linux,Perl,目前,我正在从匹配模式灰显第三行。在本例中,q33BDrP9007220是一个匹配的模式,将打印第3行,我想打印第4行和第5行,但前提是第4行和第5行的模式与第3行模式匹配。并在一行中打印这3个电子邮件ID,以“,”分隔 open (MYFILE,<$mailqdir); while(<MYFILE>) if(/(\w{14})/){ next unless \w{14})/ % 2; $temp = scalar <MYFILE>; $rf_id = $temp;

目前,我正在从匹配模式灰显第三行。在本例中,
q33BDrP9007220
是一个匹配的模式,将打印第3行,我想打印第4行和第5行,但前提是第4行和第5行的模式与第3行模式匹配。并在一行中打印这3个电子邮件ID,以“,”分隔

open (MYFILE,<$mailqdir);
while(<MYFILE>)
if(/(\w{14})/){
next unless \w{14})/ % 2;
$temp = scalar <MYFILE>;
$rf_id = $temp;
}

open(MYFILE,我不确定我是否完全理解了你的问题,尽管如此,还是试一试

在while循环中,在第一个正则表达式之后,将电子邮件地址存储在一个变量中。 e、 g.
my$addressList=$1;
并设置一个临时变量my
$temp=1;
。 稍后,如果($temp)
,您可以执行
操作,如果下一行与您的正则表达式相匹配,您可以继续追加$addressList变量,直到命中标记(q33BDrP9007220)


HTH

此示例可能会帮助您:

#!/usr/bin/perl

use warnings;
use strict;

my @emails;
while (<DATA>) {
    if (/^\w{14}\s/) {
        <DATA>;              # skip one line
        output(@emails);
        undef @emails;       # forget emails
    } elsif (/^\s+<([^>]+)>$/) {
        push @emails, $1;    # remember the email
    }
}

# Print the last rememberd emails
output(@emails);

sub output {
    print join(',', @_), "\n" if @_;
}

__DATA__
q33BDrP9007220    50153 Tue Apr  3 16:43 <mohitnegi@yahoo.com>
                 (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
                                         <tarunsharma@yahoo.com>
                                         <tararma@yahoo.com>
                                         <tarsharma@yahoo.com>
q33BDrP9007220    50153 Tue Apr  3 16:43 <mohitnegi@yahoo.com>
                 (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
                                         <tnsharma@yahoo.com>
                                         <tama@yahoo.com>
                                         <harma@yahoo.com>
q33BDrP9007220    50153 Tue Apr  3 16:43 <mohitnegi@yahoo.com>
             (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
                                     <tarunrma@yahoo.com>
                                     <taarma@yahoo.com>
                                     <tsharma@yahoo.com>
!/usr/bin/perl
使用警告;
严格使用;
我的@电子邮件;
而(){
如果(/^\w{14}\s/){
##跳过一行
输出(@email);
undef@emails;#忘记电子邮件
}elsif(/^\s++)>$/){
推送@emails,$1;#记住邮件
}
}
#打印最后一封记得的电子邮件
输出(@email);
子输出{
打印联接(',',@ux),“\n”如果@;
}
__资料__
q33BDrP9007220 50153星期二4月3日16:43
(延迟:451 4.2.1邮箱暂时禁用:paond.tndt)
q33BDrP9007220 50153星期二4月3日16:43
(延迟:451 4.2.1邮箱暂时禁用:paond.tndt)
q33BDrP9007220 50153星期二4月3日16:43
(延迟:451 4.2.1邮箱暂时禁用:paond.tndt)
另外,请阅读StackOverflow上的文章——可能是你的同事或同学发的?

下面是我的看法

use strict;
use warnings;

my $file="input_file.txt";

open (FILE,"<$file") or die "Can't open $file: $!";

my $contents = do { local $/; <FILE> };

my @arr=split('q33BDrP9007220', $contents);

foreach my $ele(@arr)
{

    $ele =~ s/([a-zA-Z0-9_.]+@[a-zA-Z]+\.[a-zA-Z]{2,4})//;

    $ele =~ s/.*?([a-zA-Z0-9_.]+@[a-zA-Z]+\.[a-zA-Z]{2,4})/$1 ,/sg;

    print $ele;

}
使用严格;
使用警告;
my$file=“input_file.txt”;

打开(文件),"感谢user1441609,我已经在$rf_id中保存了emailaddress,但是如果我搜索模式并打印下一行,它将永远不会给我结果,因为它将始终转到第一个循环并查找有效性。在这种情况下,您可能应该更好地重新表述这个问题,您是否可以扩展您正在尝试的操作。也许可以用您期望的输出是什么的示例?顺便说一句,您还应该提到这意味着什么?
next,除非\w{14}/%2
为什么在while循环中再次将整个文件作为标量读取?我将整个文件读取为标量,因为我需要匹配模式的第三行,并且第三行模式应检查具有相同模式的连续行的有效性。我想,这很接近你想要的。
use strict;
use warnings;

my $file="input_file.txt";

open (FILE,"<$file") or die "Can't open $file: $!";

my $contents = do { local $/; <FILE> };

my @arr=split('q33BDrP9007220', $contents);

foreach my $ele(@arr)
{

    $ele =~ s/([a-zA-Z0-9_.]+@[a-zA-Z]+\.[a-zA-Z]{2,4})//;

    $ele =~ s/.*?([a-zA-Z0-9_.]+@[a-zA-Z]+\.[a-zA-Z]{2,4})/$1 ,/sg;

    print $ele;

}