Perl 中多"START"模式期间的人字拖用法



我有一个Test.txt文件,如下所示:

some data1 func-name1 SECTION.
data to be extracted
data to be extracted
some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

现在,我正在使用触发器运算符来提取范围,其中我的 START=SECTION。 和 END=-退出。退出。如下:

open FILE1, "<Test.txt" 
    or die "Cannot open File1.txt!";
open FINAL, ">Final.txt" 
    or die "Cannot open Finall.txt!";
my $START = 'SECTION.';
my $END   = '-EXIT EXIT.';
while (<FILE1>) {
    if (/$START/ .. /$END|$START/) {
        if ($_ =~ m/$END|$START/) {
            $flag = 1;
        }
        print FINAL $_;
        if ($flag == 1) {          
            print FINAL "nn";
            $flag = 0;
        }
    }
}
close FINAL;
close FILE1; 

我想做的是,我需要两个下一行作为 SECTION 之间的分隔符 范围也和我的 Final.txt 应如下所示:

some data1 func-name1 SECTION.
data to be extracted
data to be extracted

some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

请指导我。

你不需要触发器:

#!/usr/bin/env perl
use strict;
use warnings;
my $first = 0;
while (<DATA>) {
    print /SECTION/ && $first++ ? "nn$_" : $_;
}
__DATA__
some data1 func-name1 SECTION.
data to be extracted
data to be extracted
some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

我用$first计算部分以确保在第一部分之前没有插入换行符,但如果第一节从第一行开始,您可以使用特殊变量$.并将$first++替换为$. > 1

表达式/SECTION/ && $first++的第一部分针对每一行计算。 /SECTION/$_ =~ /SECTION/ 的简写,这意味着如果找不到字符串SECTION,则按原样打印该行 ($_ )。

如果找到SECTION $first++则进行评估。请注意,使用后缀增量是因为我们希望$first计算第一部分的0false),以便按原样打印($_),并且仅在以下部分("nn$_")前面附加两个换行符。

最新更新