You can use this as a starting starting point:
#!/bin/bash
regexp='^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] -'
while read l; do
[[ ! ${l} =~ ${regexp} ]] && continue
ext=${l##*.}
yyyymmdd=${l%% *}
yyyymmdd="${yyyymmdd:6:2}-${yyyymmdd:4:2}-${yyyymmdd:0:4}"
channel=$(echo ${l} | awk -F- '{print $2}' | sed -e 's!^[[:space:]]*!!' -e 's![[:space:]]*$!!')
title=$(echo ${l} | awk -F- '{print $NF}' | sed -e 's!^[[:space:]]*!!' -e 's![[:space:]]*$!!')
title=${title%.*}
echo "${title} - ${yyyymmdd} - ${channel}.${ext}"
done
exit 0
This sets your regular expression to "yyyymmdd nnnn -" so it can filter out anything that does not match this string. Then for every line read in (which could be the output from find(1), ls(1), etc), it checks to see if that regular expression is matched. If so, it skips to the next line.
The next set of variable assignments are getting the various components you want. The ext assignment is getting the file extension. The yyyymmdd is getting the year, month and day. It is then reformatting by using variable substrings.
Since channel and title are delimited by a dash, I thought it would be easier to use awk(1) to get the appropriate field. The sed afterwards is to trim any spaces before and after the string. The last title is to remove the file extension.
Once have all of the variables, print out the line. This could easily be replaced with
mv ${l} "${title} - ${yyyymmdd} - ${channel}.${ext}"
to rename the file.