在第N个模式匹配后抓取一个字符 - PERL

时间:2016-05-19 06:58:03

标签: perl matching

我有一个结构如下的示例文件,我想对它执行一些操作:

1112283569;AOEEEEAOAO.;300012299419;0030000302;ALLE;0.00;0.00;0.00;0.00;79149449.66;0.00;7914944
1112283569;AOEEEEAOAO.;300012;;;;AAAAA299419;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
*;CON;*;0030000302;ΑLLEO;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149449.66;0.00
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00

我试图想出一个解决方案。我需要读一个看起来像上面那个的文件, 由';'分隔;我需要在每行第三个分隔符后对字符进行检查。它不会在 静态列,所以我需要一些方法来捕获第n个分隔符(;)之后的字符,我可能能用正则表达式做这个(我想。)

即,对于上面的输出:

第1行 - 不符合条件 第2行 - 不符合条件 3号线 - 符合条件 第4行 - 不符合条件 第5行 - 符合条件

最后它会输出如下内容:

1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00

(只有第三个分隔符后的第一个字符为*的行) 我发现这种类型的正则表达式,但我不确定它会适用于这种情况? :

   /\%(^\%([^ ]* \)\{6\}\)\@<=.

1 个答案:

答案 0 :(得分:2)

您只需split - ;,然后检查所需字段的第一个字符即可。

use strict;
use warnings;

my $char = '*';
my $nth = 3;

my $file = 'data_delim.txt';
open my $fh, '<', $file or die "Cannot open $file -- $!";

while (my $line = <$fh>) 
{
    my @fields = split ';', $line, $nth+1;

    if ($fields[$nth] =~ m/^\Q$char/) {
        print $line;
    }   
}

上面的$nth代表&#34; Nth&#34;问题示例中的规范3。我们通过传递最后一个参数告诉split只接受所需的N + 1个元素。 \Q逃脱了*,否认它的特殊含义。见quotemeta。您只能选择检查所需的字段并将循环体缩短为

print $line if (split ';', $line)[3] =~ m/^\Q$char/; # or /\*/

我怀疑这个问题可能涉及更多,并保留所有先前的条款。

对于显示输入的输入文件data_delim.txt,打印

1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00

我使用了样本输入和输出,因为我没有完全理解描述。我只能希望这是对这个问题的正确解释。