Perl:匹配后打印所有行

时间:2019-04-08 22:23:19

标签: regex perl next

我正在尝试在perl中解析文件。我想在正则表达式匹配后打印所有行

例如,文件为

num_of_dogs,10,#start_reading
num_of_cat,15
num_birds,20
num_of_butterfly,80
.....

我希望比赛#start_reading之后的所有行

我已经尝试过了,但是只打印下一行

while (my $line = <$csv_file>) {
    next unless $line =~ /(.*),#end_of_tc/;
    if ($line =~ /(.*)/){
    print $file = $1;
    }
}

输出看起来像这样

num_of_cats,15
num_of_birds,20
......

预先感谢

4 个答案:

答案 0 :(得分:7)

您可以在行包含#start_reading时设置标志,并且仅在标志为true时才打印该行:

while (my $line = <$csv_file>) {
    print $line if $start;
    $start ||= $line =~ /#start_reading/;
}

如果您想在遇到#stop_reading之后停止阅读:

while (my $line = <$csv_file>) {
    print $line if $print;
    $print ||= $line =~ /#start_reading/;
    $print &&= $line !~ /#stop_reading/;
}

答案 1 :(得分:7)

您还可以使用触发器(..)来绕过从文件开头到包含#start_reading的所有行

while (<$fh>) {
    next if 1 .. /#start_reading/;
    print;
}

这将绕过从文件的第1行到匹配#start_reading的行的打印。然后它将文件中的其余行打印出来。

答案 2 :(得分:3)

一种仅在特定时间点之后处理文件的有效且干净的方法

last if /#start_reading/ while <$csv_file>;  # get past that point in file

while (<$csv_file>) { print }                # now work on it

答案 3 :(得分:2)

 perl -ne 's/.+\,#start_reading\s*/next/e; print $_' d

通过gnu sed,如果您的数据位于“ d”,

 sed -En '/.+,#start_reading/{:s n; $q;p; bs }' d