【问题标题】:print lines below the matching line在匹配行下方打印行
【发布时间】:2012-06-08 15:14:18
【问题描述】:

目前我正在从匹配模式中搜索第 3 行。在这种情况下,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    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>

【问题讨论】:

标签: linux perl


【解决方案1】:

这个例子可能对你有所帮助:

#!/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>

另外,请阅读 StackOverflow 上的 Parsing the file perl - 可能是您的同事或同学发布的?

【讨论】:

    【解决方案2】:

    我不确定我是否完全理解您的问题,不过还是试了一下。

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

    HTH

    【讨论】:

    • 感谢 user1441609 我已经将电子邮件地址保存在 $rf_id 中,但是如果我搜索该模式并打印其下一行,它永远不会给我结果,因为它总是会转到第一个循环并寻找它有效性
    • 在这种情况下,您可能应该更好地重新表述这个问题,您能否扩展您正在尝试做的事情。或许可以通过一个示例来说明您的预期输出是什么?
    • 顺便说一句,您还应该提到这意味着什么? next unless \w{14})/ % 2;,你为什么在 while 循环中再次将整个文件作为标量读取?
    • 我正在将整个文件读入标量,因为我想要匹配模式中的第 3 行,并且第 3 行模式应该检查与第 3 行具有相同模式的连续行的有效性
    【解决方案3】:

    这就是我要走的路

    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;
    
    }
    

    您可以使用自己的电子邮件地址更改正则表达式([a-zA-Z0-9_.]+@[a-zA-Z]+\.[a-zA-Z]{2,4})

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多