Extract and parse data between two strings

Hi , I have a billing CDR file which is separated by �!�. I need to extract and format data between the starting (�!�) and the end of the line (�1.2.1.8�). These two variables are permanent tags to show begin and end.

! TICKET NBR : 2 ! GSI : 101 ! 3100.2.112.1 24/03/2010 00:41:14 ! 3100.2.105.6 Mobility ! 1.2.1.5 24/03/2010 00:41:14 ! 3100.2.19.5 302619135190023 ! 3100.2.70.15 101R=241234541717 ! 3100.2.19.7 99135190023 ! 3100.2.984.50 A18 ! 3100.2.104.4 acc_22640957031006 ! 3100.2.24.1 20 ! 3100.2.140.1 100 ! 3100.2.142.1 100 ! 100.6.5.1 1 ! 3100.2.106.1 SMS_ALWAYS_ALLOWED ! 100.6.5.2 1 ! 449032008 labl301 ! 3100.2.22.1 SMSMT ! 3100.2.20.1 9135190023 ! 3100.2.13.1 0.00 ! 3100.2.14.2 0 ! 1.2.1.8

(1) On the starting, the first two parameters are separated by semicolon (�:�) but still separated by �!�
(2) And, rest of them are separated by 4 digit number (ex: X.X.X.X <blank space> Output)� followed by return result. I want to have the output like

TICKET NBR : 2
GSI : 101
3100.2.112.1 : 24/03/2010 00:41:14
3100.2.105.6 : Mobility
1.2.1.5 : 24/03/2010 00:41:14
.
.
.(Last 3 )
3100.2.20.1: 9135190023
3100.2.13.1 : 0.00
3100.2.14.2 : 0

I am looking for a single awk/sed command to parse this information. The above example is a single line output. Any help will be greatly appreciated.
Gamini

tr '!' "\n" <file
awk '{gsub("[ ]*! ","\n")}1' CDRfile | awk '!/: /{sub(" "," : ")}NF>1'

Thanks guys