From 1e724f206eb528b337f97e56b3b44b8bf6000373 Mon Sep 17 00:00:00 2001
From: Michael Aaron Murphy <mmstickman@gmail.com>
Date: Fri, 28 Jul 2017 18:37:25 -0400
Subject: [PATCH] Implement $replace() and $replacen()

---
 src/parser/shell_expand/words.rs | 34 ++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/src/parser/shell_expand/words.rs b/src/parser/shell_expand/words.rs
index 947cc299..89bc9d00 100644
--- a/src/parser/shell_expand/words.rs
+++ b/src/parser/shell_expand/words.rs
@@ -493,6 +493,40 @@ impl<'a> StringMethod<'a> {
             "parent"       => path_eval!(parent),
             "to_lowercase" => string_case!(to_lowercase),
             "to_uppercase" => string_case!(to_uppercase),
+            "replace" => {
+                let pattern = ArgumentSplitter::new(pattern)
+                    .map(|x| expand_string(x, expand, false).join(" "))
+                    .collect::<Vec<_>>();
+                if pattern.len() == 2 {
+                    if let Some(value) = expand.vars.get_var(variable) {
+                        output.push_str(&value.replace(pattern[0].as_str(), pattern[1].as_str()));
+                    } else if is_expression(variable) {
+                        let word = expand_string(variable, &expand, false).join(" ");
+                        output.push_str(&word.replace(pattern[0].as_str(), pattern[1].as_str()));
+                    }
+                } else {
+                    eprintln!("ion: only two patterns can be supplied to $replace()");
+                }
+            }
+            "replacen" => {
+                let pattern = ArgumentSplitter::new(pattern)
+                    .map(|x| expand_string(x, expand, false).join(" "))
+                    .collect::<Vec<_>>();
+                if pattern.len() == 3 {
+                    if let Ok(nth) = pattern[2].as_str().parse::<usize>() {
+                        if let Some(value) = expand.vars.get_var(variable) {
+                            output.push_str(&value.replacen(pattern[0].as_str(), pattern[1].as_str(), nth));
+                        } else if is_expression(variable) {
+                            let word = expand_string(variable, &expand, false).join(" ");
+                            output.push_str(&word.replacen(pattern[0].as_str(), pattern[1].as_str(), nth));
+                        }
+                    } else {
+                        eprintln!("ion: the supplied count value is invalid");
+                    }
+                } else {
+                    eprintln!("ion: only three patterns can be supplied to $replacen()");
+                }
+            }
             "join" => {
                 let pattern = expand_string(pattern, expand, false).join(" ");
                 if let Some(array) = (expand.array)(variable, Select::All) {
-- 
GitLab