Sì, è una sostituzione del modello nell'espansione dei parametri della shell come:
${parameter/pattern/replacement}
Ma se il primo personaggio dopo il primo /
è o /
o #
o %
ha il significato speciale di all
(ripetuto), start
e end
.
con:
$ str='one_#two_two_three_one'
Un singolo /
sostituirà la prima istanza. La prima istanza di one
:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
O la prima istanza di two
:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
L'istanza di one
alla fine:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
Tutte le ripetizioni di two
:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
L'istanza di one
all'inizio:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
Una stringa che inizia con #
(cita il #
):
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
Ma se si lascia solo # (non quotato), la sostituzione viene impostata all'inizio della variabile:
$ echo "${str/#/====}"
====one_#two_two_three_one
Inoltre, se il parametro è un array, la sostituzione viene eseguita su tutti gli elementi:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#
e%
fanno parte del modello mentre//
è un operatore diverso/
e usa gli stessi schemi. Puoi averepattern='#x'; echo "${var/$pattern}"
(o${var//$pattern}
), mapattern=/x; echo "${var/$pattern}"
non è lo stesso diecho "${var//x}"
. Si noti che#
e%
possono essere combinati inzsh
, ma non inbash
entrambiksh
.