如何获得哪个开始没有结束

时间:2013-10-08 06:22:18

标签: regex perl

您好我有一个巨大的文件,其中有1000个BEGIN和END,我正在寻找一个逻辑,告诉我每个BEGIN是否有END。

代表:

    # Begin Variable

      Name = loopEndDriven
      Decl_type = UInt8
      Usage = Z
      Value = CE_SELECT

    # End Variable

    # Begin Variable

      Name = locationNeeded
      Decl_type = Loop_Location_t
      Usage = Z
      Value = SHORT_LOCATION

    # End Variable

4 个答案:

答案 0 :(得分:1)

perl -lne 'BEGIN{$t=0}
           if(/Begin/ ||(eof && $t==1))
           {print "No end at $." unless($t==0);$t=1}
           $t=0 if(/End/);' your_file

当每个Begin没有End时,上面的命令将打印行号。 我在下面测试过:

> cat temp
    # Begin Variable

      Name = loopEndDriven
      Decl_type = UInt8
      Usage = Z
      Value = CE_SELECT

    # End Variable

    # Begin Variable

      Name = locationNeeded
      Decl_type = Loop_Location_t
      Usage = Z
      Value = SHORT_LOCATION

    # Begin Variable

      Name = locationNeeded
      Decl_type = Loop_Location_t
      Usage = Z
      Value = SHORT_LOCATION

> perl -lne 'BEGIN{$t=0}if(/Begin/ ||(eof && $t==1)){print "No end at $." unless($t==0);$t=1}$t=0 if(/End/);' temp
No end at 17
No end at 23
>

在类似的行上,我希望你也可以编写逻辑来检查每个结尾是否有开头。

答案 1 :(得分:1)

假设不允许嵌套。

my $in_begin = 0;
while (<>) {
   if (/# Begin/) {
      warn(qq{Missing "End" at line $.\n"}) if $in_begin;
      $in_begin = 1;
   }
   elsif (/# End/) {
      warn(qq{Missing "Begin" at line $.\n"}) if !$in_begin;
      $in_begin = 0;
   }
}

warn(qq{Missing "End" at EOF\n"}) if $in_begin;

更好的诊断:

my $begin = 0;
while (<>) {
   if (/# Begin/) {
      warn(qq{Missing "End" for "Begin" at line $begin\n}) if $begin;
      $begin = $.;
   }
   elsif (/# End/) {
      warn(qq{Missing "Begin" for "End' at line $.\n"}) if !$begin;
      $begin = 0;
   }
}

warn(qq{Missing "End" for "Begin" at line $begin\n"}) if $begin;

答案 2 :(得分:0)

平衡表达式

您发布的语料库中没有BEGIN或END关键字。以下单行将使用您的块注释来检查平衡表达式。

$ perl -ne '$pairs += 1 if /Begin Variable/;
            $pairs -= 1 if /End Variable/;
            END {
              if ($pairs == 0) {print "balanced\n"} else {print "unbalanced\n"}
            }' /tmp/foo

如果您的语料库已发布,则单行应打印balanced

答案 3 :(得分:0)

当你要求逻辑而非实施时:

  • 逐行浏览文件
  • 每次遇到# Begin Variable
  • 时增加变量
  • 每次遇到# End Variable
  • 时,都会减少此变量
  • 如果变量变为2,则前一个块无效。以某种方式记录并减少。