use strict; use warnings; my @data = ('#Comment', '*ss id addr id: 099 bbb ccc aaa', '*ss id addr id: 003 aaa bbb ccc', '#Comment', '*333 23 ss id: 002 aaa bbb ccc', '*22 233333333 34432 233 44'); my @id= (); foreach my $entry (@data){ if($entry =~ /id:/){ push(@id, $entry); } } my @sortedid = sort {$a->[1] <=> $b->[1]} map{[$_,/id:\s*(\d+)/]} @id; foreach my $entry (@data){ if($entry =~ /id:/){ my $sort = shift(@sortedid); print $sort->[0]; }else{ print $entry; } print "\n"; }