您好我有一个巨大的文件,其中有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
答案 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
,则前一个块无效。以某种方式记录并减少。