bash: จะใช้การปรับแต่งสตริงหลายรายการ (การขยายพารามิเตอร์) ในขั้นตอนเดียวได้อย่างไร?
ฉันมีstring=substr1-substr2-substr3.substr4
สตริงย่อยที่มีความยาวผันแปรได้ ฉันต้องการแยกsubstr3
ออกstring
และกำลังคิดว่าจะทำโดยใช้การขยาย${string##pattern}
และการ${string%pattern}
จัดการสตริง เมื่อใช้วิธีนี้เป็นที่ชัดเจนว่าฉันจำเป็นต้องเรียกใช้${string##*-}
และดำเนินการ${string%.*}
กับส่วนขยายที่เป็นผลลัพธ์หรือในทางกลับกัน คำถามของฉันคือ:
- นี่คือทางเลือกที่ดีที่สุดหรือไม่?
- ถ้าใช่ฉันจะเรียกใช้ทั้งสองอย่างในขั้นตอนเดียวได้อย่างไร เมื่อฉันพยายามทำบางสิ่งบางอย่างเช่น
${string##*-${string%.*}}
หรือ${string%.*${string##*-}}
ฉันเพิ่งกลับสตริงเต็ม ฉันรู้ว่าฉันสามารถทำการแยกในสองขั้นตอนได้เสมอโดยกำหนดตัวแปรกลางให้กับผลลัพธ์ของขั้นตอนแรกจากนั้นจัดการกับสิ่งนั้น แต่ฉันต้องการทำในขั้นตอนเดียว ฉันจะไปเกี่ยวกับเรื่องนี้ได้อย่างไร?
เทีย!
คำตอบ
ให้
string=substr1-substr2-substr3.substr4
${string%.*}
คือ
substr1-substr2-substr3
ดังนั้น${string##*-${string%.*}}
คือ
${string##*-substr1-substr2-substr3}
ซึ่งหมายถึงการเอาออกจากจุดเริ่มต้นของทุกอย่างและรวมถึงstring
-substr1-substr2-substr3
แต่ไม่มีสตริงย่อยดังกล่าวstring
เนื่องจากไม่มีเส้นประอยู่ข้างหน้าsubstr1
ดังนั้นคุณจึงได้สตริงต้นฉบับ
สิ่งที่คุณอาจต้องการคือ
string=substr1-substr2-substr3.substr4
result="${string%.*}" result="${result##*-}"
ซึ่งนำไปสู่การcontaingresult
substr3
ใน Zsh คุณสามารถทำได้ในขั้นตอนเดียวแต่ใช้ไม่ได้ใน Bashresult=${${string%.*}##*-}
ใน Bash คุณถูก จำกัด ให้ใช้การขยายทางด้านขวาของ#
หรือ%
และนั่นไม่ได้ช่วยคุณในส่วนนี้เนื่องจากคุณต้องลบส่วนต่างๆออกจากทั้งจุดเริ่มต้นและจุดสิ้นสุดของสตริง
หรือหาก$string
ไม่มีอักขระขึ้นบรรทัดใหม่คุณสามารถใช้
IFS=.- read -r a b c d <<< "$string"
และอ่านจากsubstr3
c
ในกรณีที่ว่าขึ้นอยู่กับเปลือกและขนาดของสตริงเนื้อหาของ$string
จะถูกเก็บไว้ทั้งในแฟ้มชั่วคราวหรือป้อนผ่านท่อที่จะอ่านบรรทัดแรกจากแยกมันตามread
$IFS