Nie przetwarzałem, że jest w tablicy i myślałem, że jest oddzielony spacjami w ciągu. To rozwiązanie będzie z tym działało, ale biorąc pod uwagę, że jest to tablica, przejdź do rozwiązania manatwork ( @{my_array[@]/#/-}).
Nie jest tak źle z sedpodpowłoką. To, jak łatwa jest regex, zależy od tego, co możesz zagwarantować na temat opcji. Jeśli wszystkie opcje to jedno „słowo” ( a-zA-Z0-9tylko), wystarczy prosta początkowa granica słowa ( \<):
command $(echo $my_array | sed 's/\</-/g') "$1"
Jeśli twoje opcje mają inne postacie (najprawdopodobniej -), będziesz potrzebować czegoś bardziej złożonego:
command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"
^dopasowuje początek wiersza, [ \t]dopasowuje spację lub tabulator, \|dopasowuje dowolną stronę ( ^lub [ \t]), \( \)grupy (dla \|) i zapisuje wynik, \<dopasowuje początek słowa. \1zaczyna zastępowanie od zachowania pierwszego dopasowania z parens ( \(\)) i -oczywiście dodaje myślnik, którego potrzebujemy.
Działają z gnu sed, jeśli nie działają z twoim, daj mi znać.
A jeśli będziesz używać tej samej rzeczy wiele razy, możesz po prostu obliczyć to raz i zapisać:
opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"
-na początku każdego słowa wmy_array?