【问题标题】:Perl: Print 5 lines above regexmatchPerl:在正则表达式匹配上方打印 5 行
【发布时间】:2017-01-20 05:41:20
【问题描述】:

我正在尝试从一个巨大的数据文件中打印“END”上方的 5 行。

有人可以帮忙吗?我的文件格式是

 --   Count .    .    .     . . .   .   .   .   .   .   . . . . . . . . . . . .  -------------------------------------    ------------------------------------------- 
00000001 0000 0000 00000 2 0 01c 01d 01c 01d 01c 01d 0 1 0 1 0 0 0 0 0 0 0 00 
00000002 0001 0000 00000 2 2 019 006 019 006 019 006 0 1 1 1 1 1 1 1 1 1 0 00
00000003 0002 0000 00000 2 0 00d 007 00d 007 00d 007 0 0 0 1 0 0 0 0 0 0 0 00
00000004 0003 0000 00000 2 2 00b 009 00b 009 00b 009 0 0 0 0 0 0 0 0 0 0 0 00 
00000005 0004 0000 00000 2 2 01a 008 01a 008 01a 008 0 0 0 0 0 0 0 0 0 0 0 00
END

~

【问题讨论】:

  • 您能否展示您所引用的示例?我们在这里看不到任何运营商[$#i]。构造 $#i 是数组 @i 的最后一个元素的索引,例如@i = (100, 200, 300); 产生 $#i == 2
  • 例如:perlmonks.org/?node_id=983672"$#lines"
  • 到目前为止你尝试过什么?请编辑您的问题以包含完整的最小代码示例和可用于帮助您解决问题的小型测试文件。请包括您获得的信息和预期的结果。否则我们只是猜测。谢谢
  • 对不起。我觉得这个问题现在更清楚了
  • 请附上您尝试过的代码

标签: regex perl


【解决方案1】:

只需使用 grep:

grep END file -B 5

或者,您可以使用以下任一 Perl 单行代码:

perl -ne'print @a if /^END$/; push @a, $_; shift(@a) if @a>5;' file

perl -ne'push @a, $_; print @a if /^END$/; shift(@a) if @a>5;' file

第二个打印匹配行,第一个不打印。

【讨论】:

  • 我需要在我的脚本中使用它,这是一个聪明的部分,然后我需要对其执行操作。您能否以 perl 脚本的形式提出建议
  • 如果这必须在 perl 中,那么请显示您到目前为止所尝试的内容。
  • 您也可以在脚本中运行它,使用反引号将输出存储在变量中。可能对这个 SO 问题有帮助的更多信息:stackoverflow.com/questions/3854651/…
【解决方案2】:

只需将您读过的最后 5 行内容保留在内存中即可。

my $found = 0;
my @buf;
while (<>) {
   if (/^END$/) {
       $found = 1;
       last;
   }

   push(@buf, $_);
   shift(@buf) if @buf > 5;
}

print(@buf) if $found;

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多