Sim, é uma substituição de padrão na expansão de parâmetros do shell como:
${parameter/pattern/replacement}
Mas se o primeiro caractere após o primeiro /
for /
ou #
ou %
tiver o significado especial de all
(repetido) start
e end
.
com:
$ str='one_#two_two_three_one'
Um único /
substituirá a primeira instância. A primeira instância de one
:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
Ou a primeira instância de two
:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
A instância de one
no final:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
Todas as repetições de two
:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
A instância de one
no início:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
Uma sequência que começa com #
(aspas #
):
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
Mas se você deixar o # (não citado) sozinho, a substituição será configurada no início da variável:
$ echo "${str/#/====}"
====one_#two_two_three_one
Além disso, se o parâmetro for uma matriz, a substituição será feita em todos os elementos:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#
e%
fazem parte do padrão, enquanto//
é um operador diferente/
e usar os mesmos padrões. Você pode terpattern='#x'; echo "${var/$pattern}"
(ou${var//$pattern}
), maspattern=/x; echo "${var/$pattern}"
não é o mesmo queecho "${var//x}"
. Observe que#
e%
pode ser combinadozsh
, mas nãobash
nemksh
.