Я не обробляв, що він знаходиться в масиві, і думав, що пробіл розділений між собою. Це рішення буде працювати з цим, але, враховуючи, що це масив, перейдіть до рішення манатурки ( @{my_array[@]/#/-}).
Це не надто погано sedі з передплатою. Від того, наскільки легким буде регулярний вираз, залежить від того, що ви можете гарантувати щодо варіантів. Якщо параметри - це одне "слово" ( 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?