in reply to Extracting a block of text between start and end point
Hello shonurulez, and welcome to the Monastery!
The Perl range operator (.. in scalar context) is useful for this kind of task:
use strict; use warnings; my ($start, $keyword, $end) = ('PROC SQL', 'DELQ_STATUS', 'QUIT'); my @block; while (<DATA>) { if (/$start/i .. /$end/i) { push @block, $_; } if (/$end/i) { for (@block) { if (/AS \s+ $keyword/ix) { print join('', @block); last; } } @block = (); } } __DATA__ ...
(The contents of file “log1.log” are included immediately following the __DATA__ line; but I omit them here for the sake of brevity.) The output is as follows:
16:19 >perl 1275_SoPW.pl 481 proc sql; 482 create table work.INPUT_ACCT_POOL_3 as 483 select 484 Acct_Key, 485 Arrears_Bal_Amt, 486 ARREARS_DAYS, 531 end) as DELQ_STATUS length = 8 532 format = 8. 533 informat = 8. 534 label = 'DELQ_STATUS', 535 Arrears_Start_Date, 536 PERIODENDING, 537 PRODUCT_TYPE_CODE 538 from &SYSLAST SYMBOLGEN: Macro variable SYSLAST resolves to WORK.INPUT_ACCT_POOL_2 539 ; NOTE: A CASE expression has no ELSE clause. Cases not accounted for by + the WHEN clauses will result in a missing value for the CASE express +ion. NOTE: Compressing data set WORK.INPUT_ACCT_POOL_3 decreased size by 35 +.05 percent. Compressed is 9043 pages; un-compressed would require 13923 page +s. NOTE: Table WORK.INPUT_ACCT_POOL_3 created, with 5986698 rows and 17 c +olumns. 540 quit; 16:19 >
Hope that helps,
| Athanasius <°(((>< contra mundum | Iustus alius egestas vitae, eros Piratica, |
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Extracting a block of text between start and end point
by shonurulez (Initiate) on Jun 17, 2015 at 06:36 UTC | |
by Athanasius (Archbishop) on Jun 17, 2015 at 06:50 UTC | |
by QM (Parson) on Jun 17, 2015 at 07:51 UTC | |
by robby_dobby (Hermit) on Jun 17, 2015 at 06:52 UTC |