Here is the background to this script:
A year or two ago I tried to automate downloading Dr Who by mixing Bash Scripting and the get-iplayer program. This was both an exercise in scripting and wanting to watch Dr Who. I’ve never gotten iPlayer to work, and I’m too forgetful to run get-iplayer each time.
Here is the code:
#!/bin/bash
#Export programme names; make sure PROG is a search term that only brings up the shows you want
export PROG="Doctor Who"
export SHORT="Dr"
#Get the info you want into some text files, named after the SHORT keyword
(ls /home/$USER/Videos/iPlayer/"$PROG" | grep Doctor) >/home/$USER/Videos/iPlayer/.Code/"$SHORT"Hist.tmp
get_iplayer --listformat="<pid>: <name> - <episode>" --search="$PROG:" >/home/$USER/Videos/iPlayer/.Code/"$SHORT"Curr.tmp
#Tidy the first file to get rid of underscores
#then egrep to suck out the pid...schluuurp
sed -i 's/_/ /g' ./"$SHORT"Hist.tmp
#replace the underscores in the file name with spaces
egrep -o '[bp]{1}[0-9]{2}[0-9a-z]{4}' ./"$SHORT"Hist.tmp >./"$SHORT"Hist.txt
rm ./"$SHORT"Hist.tmp
egrep -o '[bp]{1}[0-9]{2}[0-9a-z]{4}' ./"$SHORT"Curr.tmp >./"$SHORT"Curr.txt
rm ./"$SHORT"Curr.tmp
#'b[0-9a-z]{7}' is the regex for the pid
#--I've edited this as the pid regex no longer matches the above
sort ./"$SHORT"Curr.txt -o ./"$SHORT"Curr.txt
sort ./"$SHORT"Hist.txt -o ./"$SHORT"Hist.txt
#get things in order
diff ./"$SHORT"Curr.txt ./"$SHORT"Hist.txt > ./"$SHORT"Diff.txt
rm ./"$SHORT"Curr.txt ./"$SHORT"Hist.txt
sed -i 's/[^ ]* //1' ./"$SHORT"Diff.txt
sed -i '1d' ./"$SHORT"Diff.txt
sed -i 's/---/\n/g'./"$SHORT"Diff.txt #<---this doesn't work?
sed '/^$/q'
#get-iplayer --listformat="<index>" --field=pid $(cat "$SHORT"Diff.txt | tr '\n' ' ') >./"$SHORT"Diff.txt
#sed -i '1,6d' ./"$SHORT"Diff.txt
#sed -i '/^$/,$ d' ./"$SHORT"Diff.txt
#get-iplayer --get $(cat "$SHORT"Diff.txt | tr '\n' ' ') --output="/home/$LOGNAME/Videos/iPlayer/$PROG" --force
Now I wouldn’t be posting here if this worked. There are a few issues:
- The sed line I pointed out
sed -i 's/---/\n/g'./"$SHORT"Diff.txtgive me this errorsed: -e expression #1, char 11: unknown option tos’` - The
diffprogram doesn’t seem to pick out the currentpidI don’t know what changed since it worked before.
Is anyone able to help me fix this script?
edit
As requested
uname; sed --version
produces
Linux
GNU sed version 4.2.1
And putting set -x in:
+ export 'PROG=Doctor Who'
+ PROG='Doctor Who'
+ export SHORT=Dr
+ SHORT=Dr
+ ls '/home/craig/Videos/iPlayer/Doctor Who'
+ grep Doctor
+ get_iplayer '--listformat=<pid>: <name> - <episode>' '--search=Doctor Who:'
+ sed -i 's/_/ /g' ./DrHist.tmp
+ egrep -o '[bp]{1}[0-9]{2}[0-9a-z]{4}' ./DrHist.tmp
+ rm ./DrHist.tmp
+ egrep -o '[bp]{1}[0-9]{2}[0-9a-z]{4}' ./DrCurr.tmp
+ rm ./DrCurr.tmp
+ sort ./DrCurr.txt -o ./DrCurr.txt
+ sort ./DrHist.txt -o ./DrHist.txt
+ diff ./DrCurr.txt ./DrHist.txt
+ rm ./DrCurr.txt ./DrHist.txt
+ sed -i 's/[^ ]* //1' ./DrDiff.txt
+ sed -i 1d ./DrDiff.txt
+ sed -i 's/---/\n/g./DrDiff.txt'
sed: -e expression #1, char 11: unknown option to `s'
+ sed '/^$/q'
And the output:
p00wqr1 <--one file
b00sj9q <--the contents of the other file.
b00sj9s
b010tb7
b010y5l
b0110g4
b011884
b011fnd
b011lqw
The input of the diff is the first line of output and the lines beginning b0.... Why isn’t it working when it did before?
Answering my own question:
Your diff was the wrong way round. So it wasn’t finding the right set of PIDs. Here is the working code: