替换修饰符中的参数扩展
Parameter expansion in substitution modifier
设x
为参数初始化如下:
x=("drink/beer" "drink/whine" "drink/boooze")
假设还有参数y
和z
,分别是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
设x
为参数初始化如下:
x=("drink/beer" "drink/whine" "drink/boooze")
假设还有参数y
和z
,分别是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