【问题标题】:Connecting rows in Perl after filter过滤后在 Perl 中连接行
【发布时间】:2016-02-09 15:28:19
【问题描述】:

我想问你一些建议。我的代码看起来像接下来的几行:

#!/usr/bin/env perl

while (<DATA>) {
 if (/\bSTART\b/ .. /\bEND\b/) {
    #$together = $_;
    #$together = chomp ($_);  
    print ($_, "\n");   
 }
}

__DATA__
rubish
rub
START Data Data Data start 15.05.2015 Data i want end Data 
END
rubishend

*****************
example:
START new line 1 line 2new line 3 END
*****************

我的目标是过滤多行日志。输出是匹配正则表达式的一两行。但是输出可以是一行--> 这就是我想要的。或双行,在这种情况下,我需要将第二行加入到第一行的末尾。我的代码输出如下:

START Data Data Data start 15.05.2015 Data i want end Data 
END
START new line 1 line 2new line 3 END

我想要的是:

START Data Data Data start 15.05.2015 Data i want end Data END
START new line 1 line 2new line 3 END

任何提示如何区分两条线输出并将其连接成一条线?为了在接下来的步骤中更好地解析?谢谢解答

【问题讨论】:

    标签: perl flip-flop chomp


    【解决方案1】:

    来自触发器操作员的文档:

    返回的值要么是空字符串表示假,要么是序列号(以 1 开头)表示真。 [...] 范围内的最终序列号附加了字符串“E0”

    所以,

    while (<DATA>) {
       if (my $i = /\bSTART\b/ .. /\bEND\b/) {
          s/\n/ / if $i !~ /E0\z/; 
          print;
       }
    }
    

    没有触发器操作符:

    my $in = 0;
    while (<DATA>) {
       if ($in ||= /\bSTART\b/) {
          if (/\bEND\b/) {
             $in = 0;
          } else {
             s/\n/ /;
          }
          print;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多