高效替换纯 Bash 中出现的所有子字符串

ROM*_*eer 0 bash

我想使用纯 Bash(不使用 awk、perl 或 sed)替换字符串中的所有子字符串。

这行:

string=${string/$oldValue/$newValue}
Run Code Online (Sandbox Code Playgroud)

仅替换第一次$oldValue出现。

这就是我通过以下方式做到这一点的原因:

while [[ $string == *"$oldValue"* ]]; do
    string=${string/$oldValue/$newValue}
done
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这种“丑陋”(=低效)的方法。

有一个更好的方法吗?(可能是第一行代码的通用形式)

SMA*_*SMA 6

尝试类似的方法:

export str="Hello World Hello"
export oldValue="Hello"
export newValue="Hi"
echo ${str//$oldValue/$newValue}
Hi World Hi
Run Code Online (Sandbox Code Playgroud)