Parse ; deliminated variable to create variables

Hi there, would appreciate some help on this parsing problem if anybody can help

im trying to parse a variable with the following output, each of the values im trying to parse are deliminated by a ;

T192 globalprefs={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true};5590387371d88d9e5de34c5d46b0ab8b82e7a8a90abb28a32=Bi0LdA4tBzsDOwU2BicHagA1UjcFMlBkVGdTOQM%2BX2MPbQJjAnk;%3D%3D;huddleprefs={"pagecount":41};HUDSESSID=2kul3tre4vfid0vf8cvk3f23c1;authchallenge=423c115aeaafe219533fac6d59d1b4e7;longauth=c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1Jlongauth=c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1;expires=Tue,15-Nov-202208:53:30GMT;path=/ huddleprefs={"pagecount":42};expires=Sun,17-Nov-201308:53:32GMT;path=/ globalprefs={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true};expires=Sun,17-Nov-201308:53:32GMT;path=/;domain= 

im trying to parse out both names and value's in the whole variable and store them as following

$name[1] = HUDSESSID
$value[1] = 2kul3tre4vfid0vf8cvk3f23c1
$name[2] = huddleprefs
$value[2] = {"pagecount":41}

etc... etc...

the order that the array is built does not matter, as long as I get each name and value into the appropriate array's

Can you guys point me in the correct direction in order to do this? I tried messing with eval to auto parse them but didnt have much luck getting them into an array

thanks guys

awk -F"[; ]" '{for(i=1;i<=NF;i++) {if($i~/=/){ split($i,a,"=");n[++c]=a[1];v[c]=a[2]}}}END{for(j=0;++j<=c;) print "n["j"]="n[j] "\t" "v["j"]=" v[j]}' yourfile
$ wc -l <t1
1
$ cat t1
T192 globalprefs={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true};5590387371d88d9e5de34c5d46b0ab8b82e7a8a90abb28a32=Bi0LdA4tBzsDOwU2BicHagA1UjcFMlBkVGdTOQM%2BX2MPbQJjAnk;%3D%3D;huddleprefs={"pagecount":41};HUDSESSID=2kul3tre4vfid0vf8cvk3f23c1;authchallenge=423c115aeaafe219533fac6d59d1b4e7;longauth=c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1Jlongauth=c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1;expires=Tue,15-Nov-202208:53:30GMT;path=/ huddleprefs={"pagecount":42};expires=Sun,17-Nov-201308:53:32GMT;path=/ globalprefs={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true};expires=Sun,17-Nov-201308:53:32GMT;path=/;domain=
$ awk -F"[; ]" '{for(i=1;i<=NF;i++) {if($i~/=/){ split($i,a,"=");n[++c]=a[1];v[c]=a[2]}}}END{for(j=0;++j<=c;) print "n["j"]="n[j] "\t" "v["j"]=" v[j]}' t1
n[1]=globalprefs    v[1]={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true}
n[2]=5590387371d88d9e5de34c5d46b0ab8b82e7a8a90abb28a32    v[2]=Bi0LdA4tBzsDOwU2BicHagA1UjcFMlBkVGdTOQM%2BX2MPbQJjAnk
n[3]=huddleprefs    v[3]={"pagecount":41}
n[4]=HUDSESSID    v[4]=2kul3tre4vfid0vf8cvk3f23c1
n[5]=authchallenge    v[5]=423c115aeaafe219533fac6d59d1b4e7
n[6]=longauth    v[6]=c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1Jlongauth
n[7]=expires    v[7]=Tue,15-Nov-202208:53:30GMT
n[8]=path    v[8]=/
n[9]=huddleprefs    v[9]={"pagecount":42}
n[10]=expires    v[10]=Sun,17-Nov-201308:53:32GMT
n[11]=path    v[11]=/
n[12]=globalprefs    v[12]={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true}
n[13]=expires    v[13]=Sun,17-Nov-201308:53:32GMT
n[14]=path    v[14]=/
n[15]=domain    v[15]=
$

---------- Post updated at 12:25 PM ---------- Previous update was at 12:10 PM ----------

But you could also :

1) Setup you own environment file :

awk '/=/' RS=";" myfile >myvar.env

2) Load it :

. ./myvar.env

You can then call your variables directly by using their name.

what if i want to do this from a variable holding that information rather than a file

I guess you want the names and values in shell variables, too. Try this bash approach, assuming VAR1 holds your string. You may need to refine yourself (as you did not specify further details) to eliminate unneeded parameters:

echo $VAR1|
sed 's/;[^; ]* /;/g;s/;/;\n/g' |
{ IFS="="; while read name[$((++i))] value[$i]; do echo -en "name[$i]= "${name[$i]} ",\tvalue[$i]= " ${value[$i]} "\n"; done; }
name[1]= T192 globalprefs ,    value[1]=  {"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true}; 
name[2]= 5590387371d88d9e5de34c5d46b0ab8b82e7a8a90abb28a32 ,    value[2]=  Bi0LdA4tBzsDOwU2BicHagA1UjcFMlBkVGdTOQM%2BX2MPbQJjAnk; 
name[3]= %3D%3D; ,             value[3]=  
name[4]= huddleprefs ,         value[4]=  {"pagecount":41}; 
name[5]= HUDSESSID ,           value[5]=  2kul3tre4vfid0vf8cvk3f23c1; 
name[6]= authchallenge ,       value[6]=  423c115aeaafe219533fac6d59d1b4e7; 
name[7]= longauth ,            value[7]=  c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1Jlongauth c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1; 
name[8]= expires ,             value[8]=  Tue,15-Nov-202208:53:30GMT; 
name[9]= huddleprefs ,         value[9]=  {"pagecount":42}; 
name[10]= expires ,            value[10]=  Sun,17-Nov-201308:53:32GMT; 
name[11]= globalprefs ,        value[11]=  {"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true}; 
name[12]= expires ,            value[12]=  Sun,17-Nov-201308:53:32GMT; 
name[13]= path ,               value[13]=  /; 
name[14]= domain ,             value[14]=  

I get this error on the command you specified

line 21: =name[1]=: command not found

---------- Post updated at 11:48 AM ---------- Previous update was at 11:42 AM ----------

actually never mind sorry, i got it

---------- Post updated at 01:12 PM ---------- Previous update was at 11:48 AM ----------

yeah that works great actually, currently trying to edit your code so that I dont add in duplicates, is there an easy way to do this?

# set -- $(awk 'NR==1{sub($1,z)}gsub("="," ")' RS=";" yourfile)
# for i in `seq 1 $#` ; do eval echo "'$'{$i}="'$'{$i};done
${1}=globalprefs
${2}={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true}
${3}=5590387371d88d9e5de34c5d46b0ab8b82e7a8a90abb28a32
${4}=Bi0LdA4tBzsDOwU2BicHagA1UjcFMlBkVGdTOQM%2BX2MPbQJjAnk
${5}=huddleprefs
${6}={"pagecount":41}
${7}=HUDSESSID
${8}=2kul3tre4vfid0vf8cvk3f23c1
${9}=authchallenge
${10}=423c115aeaafe219533fac6d59d1b4e7
${11}=longauth
${12}=c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1Jlongauth
${13}=c31c%2Ff6R%2Cs7y79yh6K0ryqlzEQau%2B00lAJLljU1
${14}=expires
${15}=Tue,15-Nov-202208:53:30GMT
${16}=path
${17}=/
${18}=huddleprefs
${19}={"pagecount":42}
${20}=expires
${21}=Sun,17-Nov-201308:53:32GMT
${22}=path
${23}=/
${24}=globalprefs
${25}={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true}
${26}=expires
${27}=Sun,17-Nov-201308:53:32GMT
${28}=path
${29}=/
${30}=domain

So that name='$'i (where i%2=1) and value='$'((i+1))

thanks very much for the reply once again, but it seems the last code u gave is for reading from a file, and also there seems to be duplicate names in the list?

pls be more specific: tell us which duplicates you see and which you want to be removed. Obviously there's four records of different contents, I can't see which one is redundant.

Sorry for being vague, I would like no duplicate "names" and "values" to be inserted at all,

for example this first globalprefs name and value should be entered as it is not already in the array

${1}=globalprefs ${2}={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true}

and since this later entry is already in the array I would like to not create ${24} and ${25}

${24}=globalprefs ${25}={"huddler_uid":"ad079807c1b5bca1bd05e21fd3711c1b"%2C"registered":true}

so basically I need it so any duplicate names and values be not entered twice, thanks very much for all the help guys. Im getting better with this bash command line stuff but nowhere near good yet, I appreciate the help