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
。