summary refs log tree commit diff
path: root/Functions/Misc/regexp-replace
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/Misc/regexp-replace')
-rw-r--r--Functions/Misc/regexp-replace35
1 files changed, 35 insertions, 0 deletions
diff --git a/Functions/Misc/regexp-replace b/Functions/Misc/regexp-replace
new file mode 100644
index 000000000..5aaedafba
--- /dev/null
+++ b/Functions/Misc/regexp-replace
@@ -0,0 +1,35 @@
+# Replace all occurrences of a regular expression in a variable.  The
+# variable is modified directly.  Respects the setting of the
+# option RE_MATCH_PCRE.
+#
+# First argument: *name* (not contents) of variable.
+# Second argument: regular expression
+# Third argument: replacement string.  This can contain all forms of
+# $ and backtick substitutions; in particular, $MATCH will be replaced
+# by the portion of the string matched by the regular expression.
+
+integer pcre
+
+[[ -o re_match_pcre ]] && pcre=1
+
+emulate -L zsh
+(( pcre )) && setopt re_match_pcre
+
+# $4 is the string to be matched
+4=${(P)1}
+# $5 is the final string
+5=
+local MATCH MBEGIN MEND
+local -a match mbegin mend
+
+while [[ -n $4 ]]; do
+  if [[ $4 =~ $2 ]]; then
+    5+=${4[1,MBEGIN-1]}${(e)3}
+    4=${4[MEND+1,-1]}
+  else
+    break
+  fi
+done
+5+=$4
+
+eval ${1}=${(q)5}