Tôi đã không xử lý rằng nó nằm trong một mảng và đang nghĩ khoảng cách giữa các khoảng trắng trong một chuỗi. Giải pháp này sẽ hoạt động với điều đó, nhưng cho rằng đó là một mảng, đi cùng với giải pháp của manatwork ( @{my_array[@]/#/-}
).
Điều này không quá tệ với sed
và một subshell. Regex dễ dàng như thế nào phụ thuộc vào những gì bạn có thể đảm bảo về các tùy chọn. Nếu các tùy chọn là tất cả một "từ" ( a-zA-Z0-9
chỉ), thì một ranh giới từ bắt đầu đơn giản ( \<
) sẽ đủ:
command $(echo $my_array | sed 's/\</-/g') "$1"
Nếu tùy chọn của bạn có các ký tự khác (rất có thể -
), bạn sẽ cần một cái gì đó phức tạp hơn một chút:
command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"
^
khớp với đầu dòng, [ \t]
khớp với khoảng trắng hoặc tab, \|
khớp với một trong hai bên ( ^
hoặc [ \t]
), \(
\)
các nhóm (cho \|
) và lưu trữ kết quả, \<
khớp với bắt đầu của một từ. \1
bắt đầu thay thế bằng cách giữ trận đấu đầu tiên từ parens ( \(\)
) và -
dĩ nhiên thêm dấu gạch ngang mà chúng ta cần.
Chúng hoạt động với gnu sed, nếu chúng không hoạt động với bạn, hãy cho tôi biết.
Và nếu bạn sẽ sử dụng cùng một thứ nhiều lần, bạn có thể chỉ cần tính toán một lần và lưu trữ:
opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"
-
vào đầu của mỗi từ trongmy_array
?