ฉันไม่ได้ประมวลผลว่ามันอยู่ในอาร์เรย์และกำลังคิดว่าคั่นด้วยช่องว่างในสตริง โซลูชันนี้จะทำงานร่วมกับสิ่งนั้น แต่เนื่องจากว่าเป็นอาร์เรย์ให้ใช้โซลูชันของ 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
หรือไม่