in reply to Multiline regex
G'day adrya407,
Whenever you find yourself in this position — needing to access multi-line blocks of data delimited by known or calculable boundaries — consider using one of the Range Operators. Here's an example which successfully handles all three of your posted formats:
#!/usr/bin/env perl use strict; use warnings; my $start_re = qr{(?x: ^ my_variable = )}; my $end_re = qr{(?x: (?<! ^ my_variable ) = | ^ \[ [^\]]* \] $ | ^ [*]{3} \s+ Block \s+ \d+ )}; while (<DATA>) { print if /$start_re/ .. /$end_re/ && next; }
__DATA__, and the same test data posted in the OP, are in the spoiler:
__DATA__ *** Block 1 unwanted_line1=blabla unwanted_line2=blabla my_variable=important_content_section1 important_content_section2 important_content_section3 unwanted_line3=blabla *** Block 2 unwanted_line1=blabla unwanted_line2=blabla my_variable=important_content_section1 important_content_section2 important_content_section3 [stepxyz#xxxx] *** Block 3 unwanted_line1=blabla unwanted_line2=blabla my_variable=important_content_section1 important_content_section2 important_content_section3 unwanted_line3=
Output:
my_variable=important_content_section1 important_content_section2 important_content_section3 my_variable=important_content_section1 important_content_section2 important_content_section3 my_variable=important_content_section1 important_content_section2 important_content_section3
I think that also covers most of the points from your update.
See also "perlre: Extended Patterns", which has details of the regex constructs I've used — such as (?x: pattern ) and (?<! pattern ) — and many more like them.
— Ken
|
|---|