0

I'm looking for an equivalent to std.strReplace(str, from, to) to replace parts of a string in Jsonnet. I would need from to be more like a "pattern", something like s/key="[^"]*"/key="myNewValue"/g, so actually what I'm looking for would be a regex-search-and-replace.

Edit: Ok this could possibly help me with my specific issue:

local replaceKey(string) = (
  local replaceNext = false;
  std.join('"', [
  if std.endsWith(x, "key=") then
    replaceNext = true;
    x
  else if replaceNext then
    replaceNext = false;
    "myNewValue"
  else
    x
  for x in  std.split(string, '"')
  ])
);

However the "set a new value for previously defined local variable" (replaceNext = true;) won't work.

Not a binary operator: =

Any ideas how to do it?

Heiko Finzel
  • 78
  • 1
  • 8

2 Answers2

0

Jsonnet doesn't currently support regex'ing, some refs:

jjo
  • 2,595
  • 1
  • 8
  • 16
0

I have the following solution now:

local modifyElement(element, newValue) =
  std.join('"', std.mapWithIndex(                                                             
    function(i, str)
      if i == 1 then
        newValue
      else
        str,
    std.split(element, '"')
  ));

local splitSubstring(string, pattern) = (
  local indexes = [0] + std.findSubstr(pattern, string);
  local lenIdx = std.length(indexes);
  local lenStr = std.length(string);
  std.mapWithIndex(
    function(i, strIndex)
      std.substr(string, strIndex, 
        if lenIdx > i+1 then indexes[i+1]-strIndex
        else lenStr-strIndex),
    indexes
  )
);

local replaceValue(string, searchKey, newValue) = 
  std.join("", std.mapWithIndex(
      function(index, element)
        if index == 0 then
          element
        else
          modifyElement(element, newValue),
    splitSubstring(string, searchKey)));


// TESTCASE

local oldExpression = 'rate(kube_pod_container_status_restarts_total{namespace=~"^(ns1|ns2)$",job="expose-kubernetes-metrics"}[10m]) * 60 * 5 > 0';
{'test': replaceValue(oldExpression, "namespace=~", "^myspaces-.*$")}

However I would be interested in if this could possibly be achieved easier, since this is really insane for such a trivial task.

Heiko Finzel
  • 78
  • 1
  • 8