Non ho elaborato che era in un array e pensavo che gli spazi fossero separati in una stringa. Questa soluzione funzionerà con quella, ma dato che è un array, vai con manatwork's solution ( @{my_array[@]/#/-}
).
Questo non è poi così male sed
e con una subshell. La facilità con cui regex è dipende da cosa puoi garantire sulle opzioni. Se le opzioni sono tutte una "parola" ( a-zA-Z0-9
solo), \<
sarà sufficiente un semplice limite di parola iniziale ( ):
command $(echo $my_array | sed 's/\</-/g') "$1"
Se le tue opzioni hanno altri personaggi (molto probabilmente -
), avrai bisogno di qualcosa di un po 'più complesso:
command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"
^
corrisponde all'inizio della riga, [ \t]
corrisponde a uno spazio o una scheda, \|
corrisponde a entrambi i lati ( ^
o [ \t]
), i \(
\)
gruppi (per \|
) e memorizza il risultato, \<
corrisponde all'inizio di una parola. \1
inizia la sostituzione mantenendo la prima partita dal parens ( \(\)
) e -
ovviamente aggiunge il trattino di cui abbiamo bisogno.
Questi funzionano con gnu sed, se non funzionano con i tuoi, fammi sapere.
E se utilizzerai la stessa cosa più volte, potresti volerlo calcolare una volta e archiviarlo:
opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"
-
all'inizio di ogni parola inmy_array
?