$replaceTok(string,substr,n,token)

By Imk0tter on May 07, 2021

Here is an alias that allows you to replace the n'th occurence of the specified substring in the specified string with a token.

alias replacetok {
  var %pos $pos($1,$2,$iif($3 > 0,$3,$calc($pos($1,$2,0) + $3 + 1)))
  return $+($left($1,$calc(%pos - 1)),$$4,$right($1,- $+ $calc(%pos + $len($2) - 1)))
}

Example: $replaceTok(this @ is @ a @ test, @, -1, --) = this @ is @ a -- test

Comments

Sign in to comment.
Imk0tter   -  May 09, 2021

$replacetok(%string,sub1, n1, token1, sub2, n2, token2, ...)

alias replacetok {
  var %string $1
  var %count 2

  while %count < $0 {

    var %replaceText [ $ $+ [ %count ] ]
    inc %count

    var %max $pos(%string,%replaceText, 0)

    var %token $parseRange([ $ $+ [ %count ] ], %max)
    inc %count

    var %startTok $token(%token,1,32)
    var %endTok $token(%token,2,32) + 1

    var %text [ $ $+ [ %count ] ]
    inc %count

    var %tokensReplaced 0

    while %startTok < %endTok {
      var %pos $pos(%string,%replaceText,$calc(%startTok - %tokensReplaced))
      var %string $+($left(%string,$calc(%pos - 1)),%text,$right(%string,- $+ $calc(%pos + $len(%replaceText) - 1)))

      inc %startTok
      inc %tokensReplaced
    }
  }
  return %string
}

alias -l parserange {
  var %input $1
  var %maxRange $2

  var %startNumber
  var %endNumber

  ;if the first character is a -, the first parameter is a negative number; proceed to second - or end of the string
  var %flag $iif($left(%input,1) == -,$true,$false)

  var %b $token(%input,1,45)

  var %input $iif(%flag,$right(%input,-1),%input)
  var %a $pos(%input,-,1)

  if %a == $len(%input) {
    ;second - as at end of string (range encountered) no second integer
    %startNumber = $iif(%flag,$calc(%maxRange - %b + 1),%b)
    %endNumber = %maxRange
  }
  else if !%a {
    ;no - after the first token; no range
    %startNumber = $iif(%flag,$calc(%maxRange - %b + 1),%b)
    %endNumber = %startNumber
  }
  else {
    ;range encountered; second number present
    var %startNumber $iif(%flag,$calc(%maxRange - %b + 1),%b)

    ;proceed to first - or end of string, and if there is a positive or negative integer

    var %a $iif($Pos(%input,-,1),$v1,0)
    var %b $iif($pos(%input,-,2),$v1,0)

    if %b > 0 && $calc(%b - %a) == 1 {
      ;second integer is negative,

      var %endNumber $calc(%maxRange - $token(%input,2,45) + 1)
    }
    else if %b == 0 {
      ;second integer is positive
      var %endnumber $token(%input,2,45)
    }
    else {
      ;unknown condition
      var %endnumber $token(%input,2,45)
    }
  }
  return %startNumber %endNumber
}
 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.