Issue catching/reading 2 digits and 3 letter string between brackets

Hello

I'm writing a handler for ffmpeg, and having troubles to catch some exceptions that may occour with certain files.

In order to parse for video & subtitle maps, i've had to make the raw data easier to handle, until now this worked well, but basicly i've just been lucky...

The input data is looking like this (beeing in $TMP.info):

    Stream #0:0(eng): Video: h264 (High), yuv420p, 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Stream #0:1(eng): Audio: truehd, 48000 Hz, 5.1(side), s32 (default)
    Stream #0:2(eng): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:3(eng): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:4(eng): Subtitle: hdmv_pgs_subtitle
    Stream #0:5(eng): Subtitle: hdmv_pgs_subtitle
    Stream #0:6(fre): Subtitle: hdmv_pgs_subtitle
    Stream #0:7(spa): Subtitle: hdmv_pgs_subtitle
    Stream #0:8(ger): Subtitle: hdmv_pgs_subtitle
    Stream #0:9(ara): Subtitle: hdmv_pgs_subtitle
    Stream #0:10(bul): Subtitle: hdmv_pgs_subtitle
    Stream #0:11(cze): Subtitle: hdmv_pgs_subtitle
    Stream #0:12(dan): Subtitle: hdmv_pgs_subtitle
    Stream #0:13(hrv): Subtitle: hdmv_pgs_subtitle
    Stream #0:14(fin): Subtitle: hdmv_pgs_subtitle
    Stream #0:15(gre): Subtitle: hdmv_pgs_subtitle
    Stream #0:16(heb): Subtitle: hdmv_pgs_subtitle
    Stream #0:17(hin): Subtitle: hdmv_pgs_subtitle
    Stream #0:18(hun): Subtitle: hdmv_pgs_subtitle
    Stream #0:19(ice): Subtitle: hdmv_pgs_subtitle
    Stream #0:20(nor): Subtitle: hdmv_pgs_subtitle
    Stream #0:21(pol): Subtitle: hdmv_pgs_subtitle
    Stream #0:22(rum): Subtitle: hdmv_pgs_subtitle
    Stream #0:23(srp): Subtitle: hdmv_pgs_subtitle
    Stream #0:24(slo): Subtitle: hdmv_pgs_subtitle
    Stream #0:25(slv): Subtitle: hdmv_pgs_subtitle
    Stream #0:26(swe): Subtitle: hdmv_pgs_subtitle
    Stream #0:27(tur): Subtitle: hdmv_pgs_subtitle
    Stream #0:28(rus): Subtitle: hdmv_pgs_subtitle

The mal-function parsing this input data:

	listIDs() { # [VIDEO]
	# Prints a basic table of stream ID CONTENT (and if found) LANG
	# If VIDEO is not passed, it is assumed that $TMP.info contains the current data
		[[ -z $1 ]] && \
			cmd="cat \"$TMP.info\"" || \
			cmd="StreamInfo \"$1\""
		eval $cmd |	while read strs maps kinds other;do
					kind="${kinds:0:-1}"
					lang="${maps:5:3}"
					id="${maps:3:1}"
					printf "$id \t $lang \t $kind\n"
				done
	}

Yes i am aware that strs and other are not used, but otherwise maps and kinds would contain to much data.
(for me to handle at least)

And then beeing processed by listIDs it looks like:

0 	 eng 	 Video
1 	 eng 	 Audio
2 	 eng 	 Audio
3 	 eng 	 Audio
4 	 eng 	 Subtitle
5 	 eng 	 Subtitle
6 	 fre 	 Subtitle
7 	 spa 	 Subtitle
8 	 ger 	 Subtitle
9 	 ara 	 Subtitle
1 	 (bu 	 Subtitle
1 	 (cz 	 Subtitle
1 	 (da 	 Subtitle
1 	 (hr 	 Subtitle
1 	 (fi 	 Subtitle
1 	 (gr 	 Subtitle
1 	 (he 	 Subtitle
1 	 (hi 	 Subtitle
1 	 (hu 	 Subtitle
1 	 (ic 	 Subtitle
2 	 (no 	 Subtitle
2 	 (po 	 Subtitle
2 	 (ru 	 Subtitle
2 	 (sr 	 Subtitle
2 	 (sl 	 Subtitle
2 	 (sl 	 Subtitle
2 	 (sw 	 Subtitle
2 	 (tu 	 Subtitle
2 	 (ru 	 Subtitle

So, i need help to:
1) get the 2 digits shown
2) where there should be 2 digits, print all 3 letters of the language, rather than a leading '('

Thank you in advance for any advice.

---------- Post updated at 23:07 ---------- Previous update was at 23:00 ----------

lol...
Right after posting, something i've just learned recently, came up in mind....

					lang="${maps/*\(/}"
					lang="${lang:0:-2}"
					id="${maps/\(*/}"
					id="${id:3}"

Did the trick.

0 	 eng 	 Video
1 	 eng 	 Audio
2 	 eng 	 Audio
3 	 eng 	 Audio
4 	 eng 	 Subtitle
5 	 eng 	 Subtitle
6 	 fre 	 Subtitle
7 	 spa 	 Subtitle
8 	 ger 	 Subtitle
9 	 ara 	 Subtitle
10 	 bul 	 Subtitle
11 	 cze 	 Subtitle
12 	 dan 	 Subtitle
13 	 hrv 	 Subtitle
14 	 fin 	 Subtitle
15 	 gre 	 Subtitle
16 	 heb 	 Subtitle
17 	 hin 	 Subtitle
18 	 hun 	 Subtitle
19 	 ice 	 Subtitle
20 	 nor 	 Subtitle
21 	 pol 	 Subtitle
22 	 rum 	 Subtitle
23 	 srp 	 Subtitle
24 	 slo 	 Subtitle
25 	 slv 	 Subtitle
26 	 swe 	 Subtitle
27 	 tur 	 Subtitle

You could also use IFS to get read to parse the line:

IFS=' :()'
eval "$cmd"| while read strs map id lang ignore kind other
do
   printf "%s\t" "$id" "$lang" "$kind"
   printf "\n"
done
IFS=$OIFS
1 Like