#! /usr/bin/perl use strict; my @lines = ; my @matching = map {{IDX=>$_, ID_KEY => ( $lines[$_] =~ /id:\s?(\d+)/ )}} grep $lines[$_] =~ /id:\s?\d/, 0 .. $#lines; my @sorted_matching = sort { $a->{ID_KEY} <=> $b->{ID_KEY} } @matching; @lines[map {$_->{IDX} } @matching] = @lines[map {$_->{IDX}} @sorted_matching]; 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