if $_ =~ /(\:)(\d+)\:/
 $_.sub!(/\:\d+\:/, "(#{$2}):")
end

をsub一回に書き換えられませんか?
ifのチェックをしないとsubの行の$2に値がセットされません。