替换修饰符中的参数扩展

Parameter expansion in substitution modifier

x为参数初始化如下:

x=("drink/beer" "drink/whine" "drink/boooze")

假设还有参数yz,分别是y="drink"z="buy"。 对于 x 中的每个单词,我想将匹配 y 的部分替换为 z。因此,预期输出是

buy/beer buy/whine buy/boooze

虽然下面的代码会这样做:

print ${x:s/${y}/${z}}

但是,它不起作用。 "drink" 子字符串未被替换,我可以在 modifier documentation:

中找到原因

The s/l/r/ substitution works as follows [...] When used in a history expansion, which occurs before any other expansions, l and r are treated as literal strings

这意味着,在我的尝试中,zsh 逐字搜索“${y}”,这当然找不到。有没有其他方法可以在不使用显式循环的情况下实现我的目标?

参数扩展有自己的替换语法,与历史修改运算符分开。

% print ${x/$y/$z}
buy/beer buy/whine buy/boooze