my @lines = ; my @matching_indices = grep $lines[$_] =~ /id:\s?\d/, 0 .. $#lines; my @matching_lines = @lines[@matching_indices]; my @sorted_matching_lines = sort { my ($an) = ( $a =~ /id:\s?(\d+)/ ); my ($bn) = ( $b =~ /id:\s?(\d+)/ ); $an <=> $bn } @matching_lines; @lines[@matching_indices] = @sorted_matching_lines; print @lines; __DATA__ #Comment *ss id addr id: 099 bbb ccc aaa *ss id addr id: 003 aaa bbb ccc #Comment 2 *333 23 ss id: 002 aaa bbb ccc *22 233333333 34432 233 44