ใช่มันเป็นการแทนที่รูปแบบในการขยายพารามิเตอร์เชลล์ดังนี้:
${parameter/pattern/replacement}
แต่ถ้าตัวอักษรตัวแรกหลังจากที่ครั้งแรก/
เป็นอย่างใดอย่างหนึ่ง/
หรือ#
หรือ%
ว่ามันมีความหมายพิเศษall
(ซ้ำ) และstart
end
ด้วย:
$ str='one_#two_two_three_one'
หนึ่ง/
จะแทนที่อินสแตนซ์แรก ตัวอย่างแรกของone
:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
หรือตัวอย่างแรกของtwo
:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
ตัวอย่างของone
การสิ้นสุด:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
การทำซ้ำทั้งหมดของtwo
:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
ตัวอย่างของone
การเริ่มต้น:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
สตริงที่ขึ้นต้นด้วย#
(อ้างถึง#
):
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
แต่ถ้าคุณปล่อย # (ไม่ระบุไว้) เพียงอย่างเดียวการแทนที่จะถูกตั้งไว้ที่จุดเริ่มต้นของตัวแปร:
$ echo "${str/#/====}"
====one_#two_two_three_one
นอกจากนี้หากพารามิเตอร์เป็นอาร์เรย์การแทนที่จะทำในองค์ประกอบทั้งหมด:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#
และ%
เป็นส่วนหนึ่งของรูปแบบในขณะที่//
เป็นโอเปอเรเตอร์ที่แตกต่างจาก/
และใช้รูปแบบเดียวกัน คุณสามารถมีpattern='#x'; echo "${var/$pattern}"
(หรือ${var//$pattern}
) แต่ไม่ได้เช่นเดียวกับpattern=/x; echo "${var/$pattern}"
echo "${var//x}"
โปรดทราบว่า#
และ%
สามารถรวมกันในzsh
แต่ไม่ว่ามิได้bash
ksh