有效地替换纯 Bash 中出现的所有子串

Efficiently replace all substring appearances in pure Bash

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

这一行:

string=${string/$oldValue/$newValue}

仅替换第一次 $oldValue 出现。

这就是我按以下方式进行操作的原因:

while [[ $string == *"$oldValue"* ]]; do
    string=${string/$oldValue/$newValue}
done

但我不喜欢这种 "ugly"(=低效)方法。

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

添加一个额外的 / 以将所有 $oldValue 替换为 $newValue:

string="${string//$oldValue/$newValue}"

试试这样的东西:

export str="Hello World Hello"
export oldValue="Hello"
export newValue="Hi"
echo ${str//$oldValue/$newValue}
Hi World Hi