I'm parsing a large file in Perl line-by-line (terminated by \n), but when I reach a certain keyword, say "TARGET", I need to grab all the lines between TARGET and the next completely empty line.
So, given a segment of a file:
Line 1
Line 2
Line 3
Line 4 Target
Line 5 Grab this line
Line 6 Grab this line
\n
It should become:
Line 4 Target
Line 5 Grab this line
Line 6 Grab this line
The reason I'm having trouble is I'm already going through the file line-by-line; how do I change what I delimit by midway through the parsing process?
From perlfaq6's answer to How can I pull out lines between two patterns that are themselves on different lines?
You can use Perl's somewhat exotic .. operator (documented in perlop):
If you wanted text and not lines, you would use
But if you want nested occurrences of START through END, you'll run up against the problem described in the question in this section on matching balanced text.
Here's another example of using ..:
If you only want one loop (modifying Dave Hinton's code):
If you don't mind ugly auto-generated code, and assuming you just want lines between
TARGET
and the next empty line, and want all the other lines to be dropped, you can use the output of this command:(Yes, this is a hint that this problem is usually much more easily solved in
sed
. :-P)