Ja, es handelt sich um eine Musterersetzung bei der Shell-Parametererweiterung als:
${parameter/pattern/replacement}
Aber wenn das erste Zeichen nach dem ersten /
entweder /
oder ist #
oder %
die spezielle Bedeutung von all
(wiederholt) start
und hat end
.
mit:
$ str='one_#two_two_three_one'
Eine einzelne /
wird die erste Instanz ersetzen. Die erste Instanz von one
:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
Oder die erste Instanz von two
:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
Die Instanz von one
am Ende:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
Alle Wiederholungen von two
:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
Die Instanz von one
zu Beginn:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
Eine Zeichenfolge, die mit #
(Anführungszeichen #
) beginnt :
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
Wenn Sie jedoch das # (ohne Anführungszeichen) in Ruhe lassen, wird die Ersetzung am Anfang der Variablen festgelegt:
$ echo "${str/#/====}"
====one_#two_two_three_one
Wenn der Parameter ein Array ist, erfolgt die Ersetzung außerdem für alle Elemente:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#
und%
Teil des Musters sind, während//
ein anderer Operator/
als die gleichen Muster verwendet wird. Sie können habenpattern='#x'; echo "${var/$pattern}"
(oder${var//$pattern}
), ist aberpattern=/x; echo "${var/$pattern}"
nicht dasselbe wieecho "${var//x}"
. Beachten Sie, dass#
und%
inzsh
, aber nichtbash
noch kombiniert werden könnenksh
.