# gosub(regexp, replacement [, target]) # Aka global original sub # Behaves like gsub, however doesn't try regexp on previoud replacements # and returns the result string, rather than doing it inplace. function gosub(regexp, replacement, target) { if (!length(target)) { target = $0; } result = ""; matched = ""; while (match(target, regexp)) { result = result substr(target, 1, RSTART - 1); matched = substr(target, RSTART, RLENGTH); target = substr(target, RSTART + RLENGTH); sub(regexp, replacement, matched); result = result matched; } return result target; } # gesub(regexp, exregexp, replacement [, target]) # Aka global excluding sub # Behaves like gsub, however substitutes only where exregexp doesn't match # and returns the result string, rather than doing it inplace. function gesub(regexp, exregexp, replacement, target) { if (!length(target)) { target = $0; } result = ""; while (match(target, exregexp)) { beg = substr(target, 1, RSTART - 1); exclude = substr(target, RSTART, RLENGTH); target = substr(target, RSTART + RLENGTH); gsub(regexp, replacement, beg); result = result beg exclude; } gsub(regexp, replacement, target); return result target; }