This is a project I am working on just to better understand some concepts. It has the added advantage of begin semi useful to me.
Alright I have a list of songs I need to parse. The list is from freedb and looks like the following:
Code:
DISCID=abcdef01
DTITLE=Artist / Album
DYEAR=2006
DGENRE=Classical
TTITLE0=Song 1
TTITLE1=Song 2
TTITLE2=Song 3
TTITLE3=Song 4
TTITLE4=Song 5
TTITLE5=Song 6
TTITLE6=Song 7
TTITLE7=Song 8
TTITLE8=Song 9
TTITLE9=Song 10
TTITLE10=Song 11
TTITLE11=Song 12
TTITLE12=Song 13
TTITLE13=Song 14
EXTD= YEAR: 2006 ID3G: 47
EXTT0=
EXTT1=
EXTT2=
EXTT3=
EXTT4=
EXTT5=
EXTT6=
EXTT7=
EXTT8=
EXTT9=
EXTT10=
EXTT11=
EXTT12=
EXTT13=
PLAYORDER=
.
I need to parse that so I have Artist, Album, Year, and song names. Here is what I have so far:
Code:
while read line
do
if echo $line | grep DTITLE > /dev/null
then ARTIST=$(echo "$line" | sed -e 's/DTITLE=//' | sed -e 's/ \/.*//')
ALBUM=$(echo "$line" | sed -e 's/.*\/ //')
elif echo $line | grep DYEAR > /dev/null
then YEAR=$(echo "$line" | sed -e 's/DYEAR=//')
elif echo $line | grep TTITLE0= > /dev/null
then TRACK01=$(echo "$line" | sed -e 's/TTITLE0=//')
elif echo $line | grep TTITLE1= > /dev/null
then TRACK02=$(echo "$line" | sed -e 's/TTITLE1=//')
elif echo $line | grep TTITLE2= > /dev/null
then TRACK03=$(echo "$line" | sed -e 's/TTITLE2=//')
elif echo $line | grep TTITLE3= > /dev/null
then TRACK04=$(echo "$line" | sed -e 's/TTITLE3=//')
elif echo $line | grep TTITLE4= > /dev/null
then TRACK05=$(echo "$line" | sed -e 's/TTITLE4=//')
elif echo $line | grep TTITLE5= > /dev/null
then TRACK06=$(echo "$line" | sed -e 's/TTITLE5=//')
elif echo $line | grep TTITLE6= > /dev/null
then TRACK07=$(echo "$line" | sed -e 's/TTITLE6=//')
elif echo $line | grep TTITLE7= > /dev/null
then TRACK08=$(echo "$line" | sed -e 's/TTITLE7=//')
elif echo $line | grep TTITLE8= > /dev/null
then TRACK09=$(echo "$line" | sed -e 's/TTITLE8=//')
elif echo $line | grep TTITLE9= > /dev/null
then TRACK10=$(echo "$line" | sed -e 's/TTITLE9=//')
elif echo $line | grep TTITLE10= > /dev/null
then TRACK11=$(echo "$line" | sed -e 's/TTITLE10=//')
elif echo $line | grep TTITLE11= > /dev/null
then TRACK12=$(echo "$line" | sed -e 's/TTITLE11=//')
elif echo $line | grep TTITLE12= > /dev/null
then TRACK13=$(echo "$line" | sed -e 's/TTITLE12=//')
elif echo $line | grep TTITLE13= > /dev/null
then TRACK14=$(echo "$line" | sed -e 's/TTITLE13=//')
elif echo $line | grep TTITLE14= > /dev/null
then TRACK15=$(echo "$line" | sed -e 's/TTITLE14=//')
elif echo $line | grep TTITLE15= > /dev/null
then TRACK16=$(echo "$line" | sed -e 's/TTITLE15=//')
elif echo $line | grep TTITLE16= > /dev/null
then TRACK17=$(echo "$line" | sed -e 's/TTITLE16=//')
elif echo $line | grep TTITLE17= > /dev/null
then TRACK18=$(echo "$line" | sed -e 's/TTITLE17=//')
elif echo $line | grep TTITLE18= > /dev/null
then TRACK19=$(echo "$line" | sed -e 's/TTITLE18=//')
elif echo $line | grep TTITLE19= > /dev/null
then TRACK20=$(echo "$line" | sed -e 's/TTITLE19=//')
elif echo $line | grep TTITLE20= > /dev/null
then TRACK21=$(echo "$line" | sed -e 's/TTITLE20=//')
elif echo $line | grep TTITLE21= > /dev/null
then TRACK22=$(echo "$line" | sed -e 's/TTITLE21=//')
fi
done < <(echo "$freedbalbuminfo")
Not eloquent at all, I know. That is where I need some help. It is fully functional, but not dynamic.
The variables are as follows:
Code:
$freedbalbuminfo contains the freedb response with all of the information in the first code block
$numtracks contains the number of tracks on the disc
I need a dynamic way of parsing/declaring the TRACK names without the above kludge.
I am willing to rewrite the entire section, if there is a better way of doing this.
Please note:
The above code works! It is just not clean.
This is a learning experience for me, I am comfortable with bash, grep, sed, ect, but I am no guru.
---Solved---
I ended up using arrays as millgates suggested. The final code is below.
Code:
tracknames=()
while read LINE
do
case "$LINE" in
DTITLE*)
ARTIST=$(echo "$LINE" | sed -e 's/.*=//' -e 's/ \/ .*//')
ALBUM=$(echo "$LINE" | sed -e 's/.* \/ //')
;;
DYEAR*)
YEAR=$(echo "$LINE" | sed -e 's/.*=//')
;;
TTITLE*)
TRACKNAMES+=("$(echo "$LINE" | sed -e 's/.*=//')")
;;
esac
done < <(echo "$FREEDBREAD")