2

入力変数には以下が含まれます。

key1-key2-key3_command

出力は次のようにする必要があります。

command -k key1 -k key2 -k key3

警告: キーの数は 1 から 3 までさまざまです。

ダッシュの数を数え、それを if ステートメントで使用して、各キーのブール インジケーターを作成します (つまり、key1=1、key2 の設定を解除します)。${parameter:+word}次に、そのキーのフラグが設定されている場合にキーを追加するようなものを使用するつもりでした。少し面倒になり始めたので、これを達成するための最良の方法についてここで質問したいと思いました。

4

3 に答える 3

5
var='key1-key2-key3_command'

IFS=_ read -r  keys command <<< "$var"   # Split $var at underscores.
IFS=- read -ra keys         <<< "$keys"  # Split $keys at dashes, -a to save as array.

for key in "${keys[@]}"; do              # Treat $command as an array and add
    command+=(-k "$key")                 # -k arguments to it.
done

echo "${command[@]}"

ノート:

  • これは、任意の数のキーを処理します。
  • 空白を含むキーを処理します。
  • への変更$IFSは一時的なものです。後続のコマンドには影響しません。
  • コマンドを実行する場合は、最後の行を単に"${command[@]}"(エコーなし) に変更します。
于 2013-01-15T20:35:12.970 に答える
1
echo "key1-key2-key3_command" | sed -r 's/(.*?)-(.*?)-(.*?)_(.*?)/\4 -k \1 -k \2 -k \3/g'
command -k key1 -k key2 -k key3
于 2013-01-15T20:28:51.790 に答える
0

サブシェルで実行して、現在の IFS と位置パラメータの汚染を回避します

( 
    IFS="-_"
    set -- $var
    command=("${!#}")
    while [[ "$1" != "${command[0]}" ]]; do 
        command+=(-k "$1")
        shift
    done
    echo "${command[@]}"
)

「echo」を削除して実行します。

于 2013-01-15T21:50:45.773 に答える