过滤后在 Perl 中连接行
Connecting rows in Perl after filter
我想问你一些提示。我的代码看起来像接下来的几行:
#!/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
有什么技巧可以区分两线输出并接成一条线吗?为了在接下来的步骤中更好地解析?谢谢回答
来自触发器运算符的文档:
The value returned is either the empty string for false, or a sequence number (beginning with 1) for true. [...] The final sequence number in a range has the string "E0" appended to it
所以,
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;
}
}
我想问你一些提示。我的代码看起来像接下来的几行:
#!/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
有什么技巧可以区分两线输出并接成一条线吗?为了在接下来的步骤中更好地解析?谢谢回答
来自触发器运算符的文档:
The value returned is either the empty string for false, or a sequence number (beginning with 1) for true. [...] The final sequence number in a range has the string "E0" appended to it
所以,
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;
}
}