ฉันไม่ได้ประมวลผลว่ามันอยู่ในอาร์เรย์และกำลังคิดว่าคั่นด้วยช่องว่างในสตริง โซลูชันนี้จะทำงานร่วมกับสิ่งนั้น แต่เนื่องจากว่าเป็นอาร์เรย์ให้ใช้โซลูชันของ manatwork ( @{my_array[@]/#/-})
สิ่งนี้ไม่ได้เลวร้ายกับsedและ subshell regex นั้นง่ายเพียงใดขึ้นอยู่กับสิ่งที่คุณสามารถรับประกันได้เกี่ยวกับตัวเลือก หากตัวเลือกทั้งหมดเป็น "คำ" ( a-zA-Z0-9เท่านั้น) ขอบเขตคำศัพท์เริ่มต้นง่ายๆ ( \<) จะพอเพียง:
command $(echo $my_array | sed 's/\</-/g') "$1"
หากตัวเลือกของคุณมีอักขระอื่น ๆ (น่าจะเป็นไปได้มากที่สุด-) คุณจะต้องมีอะไรที่ซับซ้อนกว่านี้เล็กน้อย:
command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"
^ตรงกับจุดเริ่มต้นของบรรทัด[ \t]ตรงกับช่องว่างหรือแท็บ\|ตรงกับด้านใดด้านหนึ่ง ( ^หรือ[ \t]) \( \)กลุ่ม (สำหรับ\|) และเก็บผลลัพธ์\<ตรงกับจุดเริ่มต้นของคำ \1เริ่มต้นการแทนที่โดยรักษานัดแรกจาก parens ( \(\)) และ-แน่นอนเพิ่มเส้นประที่เราต้องการ
สิ่งเหล่านี้ใช้ได้กับ gnu sed หากพวกเขาไม่ทำงานกับคุณโปรดแจ้งให้เราทราบ
และหากคุณใช้สิ่งเดียวกันหลาย ๆ ครั้งคุณอาจต้องการคำนวณเพียงครั้งเดียวและเก็บไว้:
opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"
-ไปยังจุดเริ่มต้นของแต่ละคำในmy_arrayหรือไม่