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