【问题标题】:Perl : Print all lines after matchPerl:匹配后打印所有行
【发布时间】:2019-08-30 03:27:07
【问题描述】:

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

提前致谢

【问题讨论】:

  • 你能通过编辑你的帖子来显示输入文件的样子吗?

标签: regex perl next


【解决方案1】:

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

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

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:*.com/help/how-to-answer。祝你好运?
【解决方案2】:

当行包含#start_reading 时,您可以设置一个标志,并且仅在标志为真时打印该行:

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/;
}

【讨论】:

  • while (&lt;$csv_file&gt;) { print if $start; $start ||= /#start_reading/; }
  • 谢谢,如何停止阅读?我想在#stop_reading 之后停止阅读,谢谢
  • @JigarVaidya 我已经用停止的解决方案更新了我的答案。
  • @blhsing 脚本在#stop_reading 之后没有停止,它仍然一直读到底部...我的代码push @loop_reg, $line if $print; $print ||= $line =~ m/#lane_loop_start/; $print &amp;&amp;= $line !~ m/#lane_loop_stop/;
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:
     perl -ne 's/.+\,#start_reading\s*/next/e; print $_' d
    

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

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】: