arr = Array.new
re = /#AAA#\((.+?) (.+?) (.+?)\)..+?#CCC#\((.+?)\)/m
ARGF.read.scan(re){
arr.push([[$1,$2,$3],$4])
}

arr.each do |a|
puts "#{a[0][0]}#{a[1]}"
puts "#{a[0][1]}#{a[1]}"
puts "#{a[0][2]}#{a[1]}"
end


たぶん動く
めんどくさいので「#AAA#から#CCC#まで」をひと塊として配列にぶち込んだ
データは一気に読み込んでるので、100メガ単位とかで実行マシンのメモリに対してあまりに大きいと危険