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) startund 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 oneam 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 onezu 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 nichtbashnoch kombiniert werden könnenksh.