Oui, c'est un remplacement de modèle dans l' expansion des paramètres du shell comme:
${parameter/pattern/replacement}
Mais si le premier caractère après le premier /
est ou /
ou #
ou %
il a la signification spéciale de all
(répété),start
et end
.
avec:
$ str='one_#two_two_three_one'
Un single /
remplacera la première instance. La première instance de one
:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
Ou la première instance de two
:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
L'instance de one
à la fin:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
Toutes les répétitions de two
:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
L'instance de one
au début:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
Une chaîne commençant par #
(citez le#
):
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
Mais si vous laissez le # (sans guillemets) seul, le remplacement est défini au début de la variable:
$ echo "${str/#/====}"
====one_#two_two_three_one
De plus, si le paramètre est un tableau, le remplacement se fait sur tous les éléments:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#
et%
font partie du modèle tandis qu'il//
est différent de l'opérateur/
et utilise les mêmes modèles. Vous pouvez avoirpattern='#x'; echo "${var/$pattern}"
(ou${var//$pattern}
), mais cepattern=/x; echo "${var/$pattern}"
n'est pas la même chose queecho "${var//x}"
. Notez que#
et%
peut être combiné danszsh
, mais pas dansbash
niksh
.