Tak, jest to zamiana wzorca w rozszerzaniu parametrów powłoki, ponieważ:
${parameter/pattern/replacement}
Ale jeśli pierwszy znak po pierwsze /
jest albo /
albo #
albo %
ma specjalne znaczenie all
(powtórzone), start
a end
.
z:
$ str='one_#two_two_three_one'
Pojedynczy /
zastąpi pierwszą instancję. Pierwsze wystąpienie one
:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
Lub pierwsza instancja two
:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
Wystąpienie one
na końcu:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
Wszystkie powtórzenia two
:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
Wystąpienie one
na początku:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
Ciąg rozpoczynający się od #
(cytuj #
):
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
Ale jeśli pozostawisz # (niecytowany) w spokoju, zamiana zostanie ustawiona na początku zmiennej:
$ echo "${str/#/====}"
====one_#two_two_three_one
Ponadto, jeśli parametr jest tablicą, zamiana jest wykonywana dla wszystkich elementów:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#
i%
stanowią część wzorca, podczas gdy//
różni się od operatora/
i używa tych samych wzorców. Możesz miećpattern='#x'; echo "${var/$pattern}"
(lub${var//$pattern}
), alepattern=/x; echo "${var/$pattern}"
to nie to samo coecho "${var//x}"
. Zauważ, że#
i%
można łączyćzsh
, ale niebash
aniksh
.