#!/usr/bin/env perl use warnings; use strict; use Data::Dump qw/dump/; $_ = do { local $/; }; dump { map { /(.+)\n/ => [ /^interesting line (.+?)$/mg ] } grep length, split /^Index: /m } __DATA__ Index: file1.txt Bunch of junk interesting line 1 more junk interesting line 2 more junk Index: subdir/file2.txt interesting line A1 still more junk interesting line A2 last of the junk