BEGIN { rules[0.0] = "X 1=bah 2=foo"; rules[0.1] = "X 1=whee 2=yaz"; } function applyrule(s,rule, n,rv,blah) { n = split(rule,rv); if (!index(s,"${" rv[1] ":")) return ""; for (i = 2;i <= n;++i) { split(rv[i],blah,"="); gsub("\\${" rv[1] ":" blah[1] "}",blah[2],s); } return s; } function doit(s, didit) { for (i in rules) if (t = applyrule(s,rules[i])) { didit = 1; doit(t); } if (!didit) print s; } { doit($0); }