diff --git a/lib/default.nix b/lib/default.nix index e6e6aaa983d5..9b61d45713ba 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -309,6 +309,7 @@ let stringLength substring isString + replaceString replaceStrings intersperse concatStringsSep diff --git a/lib/strings.nix b/lib/strings.nix index ba055bc3d22d..4aef18efd212 100644 --- a/lib/strings.nix +++ b/lib/strings.nix @@ -332,6 +332,41 @@ rec { */ concatLines = concatMapStrings (s: s + "\n"); + /** + Given string `s`, replace every occurrence of the string `from` with the string `to`. + + # Inputs + + `from` + : The string to be replaced + + `to` + : The string to replace with + + `s` + : The original string where replacements will be made + + # Type + + ``` + replaceString :: string -> string -> string -> string + ``` + + # Examples + :::{.example} + ## `lib.strings.replaceString` usage example + + ```nix + replaceString "world" "Nix" "Hello, world!" + => "Hello, Nix!" + replaceString "." "_" "v1.2.3" + => "v1_2_3" + ``` + + ::: + */ + replaceString = from: to: replaceStrings [ from ] [ to ]; + /** Repeat a string `n` times, and concatenate the parts into a new string. diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index ef2d74b63162..99b335cdb295 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -91,6 +91,7 @@ let range recursiveUpdateUntil removePrefix + replaceString replicate runTests setFunctionArgs @@ -497,6 +498,11 @@ runTests { expected = "/usr/include:/usr/local/include"; }; + testReplaceStringString = { + expr = strings.replaceString "." "_" "v1.2.3"; + expected = "v1_2_3"; + }; + testReplicateString = { expr = strings.replicate 5 "hello"; expected = "hellohellohellohellohello"; @@ -1706,6 +1712,11 @@ runTests { ]; }; + testReplaceString = { + expr = replaceString "world" "Nix" "Hello, world!"; + expected = "Hello, Nix!"; + }; + testReplicate = { expr = replicate 3 "a"; expected = [