Search code examples
bashparameter-expansionshellcheck

Is it possible to resolve SC2001 ("See if you can use ${variable//search/replace} instead") while using a position variable?


I'm looking for a one liner to replace any character in a variable string at a variable position with a variable substitute. I came up with this working solution:

echo "$string" | sed "s/./${replacement}/${position}"

An example usage:

string=aaaaa
replacement=b
position=3
echo "$string" | sed "s/./${replacement}/${position}"
aabaa

Unfortunately, when I run shellcheck with a script which contains my current solution it tells me:

SC2001: See if you can use ${variable//search/replace} instead.

I'd like to use parameter expansion like it's suggesting instead of piping to sed, but I'm unclear as to the proper formatting when using a position variable. The official documentation doesn't seem to discuss positioning within strings at all.

Is this possible?


Solution

  • Bash doesn't have a general-case replacement for all sed facilities (the shellcheck wiki page for warning SC2001 acknowledges as much), but in some specific scenarios -- including the case posed -- parameter expansions can be combined to achieve the desired effect:

    string=aaaaa
    replacement=b
    position=3
    echo "${string:0:$(( position - 1 ))}${replacement}${string:position}"
    

    Here, we're splitting the value up into substrings: ${string:0:$(( position - 1 ))} is the text preceding the content to be replaced, and ${string:position} is the text following that point.