regex Perl:打印匹配后的所有行

mjqavswn  于 2023-05-30  发布在  Perl
关注(0)|答案(5)|浏览(175)

我正在用perl解析一个文件。我想打印regex匹配后的所有行
例如,文件为

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
......

先谢谢你了

wko9yo5t

wko9yo5t1#

当行包含#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/;
}
mfpqipee

mfpqipee2#

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

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

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

nwlqm0z1

nwlqm0z13#

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

通过gnu sed,如果你的数据在'd ',

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

owfi6suc4#

一个高效和干净的方式来处理一个文件后,只有在一定的点

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

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

2jcobegt5#

这可以通过下面的命令来实现。/xxx/../yyy/让perl打印两个匹配项之间的文本。在您的例子中,第二个匹配只是文件的结尾,所以使用关键字EOF

perl -ne 'print if /^match/../EOF/'

相关问题