Да, это замена шаблона в расширении параметров оболочки :
${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
.