Answers:
是的,它是shell参数扩展中的模式替换,如下所示:
${parameter/pattern/replacement}
但是,如果第一个字符之后的第一个字符/是/或#或,%则它具有all(重复)start和的特殊含义end。
与:
$ str='one_#two_two_three_one'
单个/将替换第一个实例。的第一个实例one:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
或者第一个实例two:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
最后的实例one:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
所有重复two:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
开始时的实例one:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
以#(引号#)开头的字符串:
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
但是,如果您仅保留#(不带引号),则替换将在变量的开头设置:
$ echo "${str/#/====}"
====one_#two_two_three_one
此外,如果参数是数组,则对所有元素进行替换:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#和%是模式的一部分,而//运算符不同于/并使用相同的模式。您可以拥有pattern='#x'; echo "${var/$pattern}"(或${var//$pattern}),但与pattern=/x; echo "${var/$pattern}"有所不同echo "${var//x}"。请注意,#并%可以组合zsh,但不能bash也不ksh。