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 sed
podpowł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-9
tylko), 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. \1
zaczyna 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
?