Ich habe nicht verarbeitet, dass es sich um ein Array handelt, und ich habe an durch Leerzeichen getrennte Zeichenfolgen gedacht. Diese Lösung wird damit funktionieren, aber da es sich um ein Array handelt, sollten Sie die Lösung von manatwork ( @{my_array[@]/#/-}
) verwenden.
Das ist nicht schlecht mit sed
und eine Unterschale. Wie einfach der reguläre Ausdruck ist, hängt davon ab, was Sie für die Optionen garantieren können. Wenn alle Optionen ( a-zA-Z0-9
nur) ein "Wort" sind , reicht eine einfache Anfangswortgrenze ( \<
) aus:
command $(echo $my_array | sed 's/\</-/g') "$1"
Wenn Ihre Optionen (höchstwahrscheinlich -
) andere Zeichen enthalten , benötigen Sie etwas Komplexeres:
command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"
^
Stimmt mit dem Zeilenanfang [ \t]
überein , stimmt mit einem Leerzeichen oder Tab \|
überein , stimmt mit einer Seite ( ^
oder [ \t]
) überein , \(
\)
gruppiert (für die \|
) und speichert das Ergebnis, \<
stimmt mit dem Wortanfang überein. \1
Beginnt die Ersetzung damit, dass die erste Übereinstimmung von den parens ( \(\)
) beibehalten wird , und -
fügt natürlich den Strich hinzu, den wir benötigen.
Diese arbeiten mit gnu sed zusammen, wenn sie nicht mit deiner zusammenarbeiten, lass es mich wissen.
Und wenn Sie dasselbe Produkt mehrmals verwenden, möchten Sie es möglicherweise nur einmal berechnen und speichern:
opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"
-
den Anfang jedes Wortes inmy_array
einfügen?