打印匹配后的所有行

3
我正在尝试使用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
......

你可以通过编辑您的帖子来展示输入文件是什么样子吗? - m.raynal
5个回答

6
你还可以使用翻转脚印(..)操作符,跳过从文件开头到包含#start_reading的那一行之间的所有内容。
while (<$fh>) {
    next if 1 .. /#start_reading/;
    print;
}

这将从文件的第一行绕过打印,直到匹配#start_reading的行。然后它会打印文件中剩余的行。


5
当行包含#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
while (<$csv_file>) { print if $start; $start ||= /#start_reading/; } - ikegami
谢谢,如何停止阅读?我想在 #stop_reading 后停止阅读,谢谢。 - Jigar Vaidya
@JigarVaidya 我已经更新了我的答案,并提供了一个停止的解决方案。 - blhsing
@blhsing,脚本在#stop_reading后没有停止,仍然读取到底部...我的代码为 push @loop_reg, $line if $print; $print ||= $line =~ m/#lane_loop_start/; $print &&= $line !~ m/#lane_loop_stop/; - Jigar Vaidya

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

使用gnu sed,如果您的数据在“d”中:

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

2

在特定点之后高效且干净地处理文件的方法

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

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

2
这可以通过以下命令实现。 /xxx/../yyy/ 让 Perl 打印两个匹配之间的文本。在您的情况下,第二个匹配只是文件末尾,因此使用关键字 EOF
perl -ne 'print if /^match/../EOF/'

1
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。您可以在帮助中心找到有关编写良好答案的更多信息:https://stackoverflow.com/help/how-to-answer。祝你好运! - nima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接