/^#def/ {Struct[$1] = $2} BEGIN { PairB = "([A-Za-z0-9_]*[a-z0-9]):([A-Z][A-Za-z0-9_]*)" Pair = "[A-Za-z0-9_]*[a-z0-9]:[A-Z][A-Za-z0-9_]*"} Var = "_[A-Za-z0-9_]*" Reference = "[a-z0-9]:[A-Z]" } Reference { while(match($0,PairB,pairs) { var=pair[1] class=pair[2] renames = Vars["_"var]= rename(var,Struct[class]) sub(Pair,renames,$0) } } Var { while(match($0,Var)) sub(Var,Vars[substring($0,RSTART,RLENGTH)],$0) } function rename(pre,str, tmp,n,out,i) { n=split(str,tmp,",") out = pre"_" tmp[1] for(i=2;i<=n;i++) out=out pre"_" tmp[2] return out }