1

Bash で記述されたコードを含むソース ファイルがあります。ソースファイルには、次のようないくつかの関数が定義されています

 - abc(i,j,k)

シェル スクリプトを使用してソース ファイルを読み取る必要があり、次のような関数呼び出しのすべての可能な組み合わせを生成する必要があります。

出力

 - abc(i,j,k)
 - abc(i,j,)
 - abc(i,,j)
 - abc(,j,k)
 - abc(,,k)
 - abc(i,,)
 - abc(,j,)
 - abc(,,)

引数が 3 つの場合、組み合わせは 8 つあるため、引数の数に応じて組み合わせが増減します。

4

2 に答える 2

4

bash のブレース展開は、組み合わせを生成できます。

printf -- "- abc(%s}\n" {i,},{j,},{k,}

しかし、それよりももう少しダイナミックにしたいと思います。これは見苦しいコードですが、機能します。

while IFS= read -r line; do
    # match a line that looks like a function,
    # and capture the function name and the parameter list
    if [[ $line =~ " - "([[:alnum:]]+)\(([a-z,]+)\) ]]; then
        funcname=${BASH_REMATCH[1]}
        # split the comma-separated parameters into an array
        IFS=, read -ra params <<< "${BASH_REMATCH[2]}"
        # create the brace-expansion string
        printf -v combos "{%s,}," "${params[@]}"
        # and this is the command to print out the combinations
        cmd=( printf -- "\"- $funcname(%s)\n\"" ${combos%,} )
        # now evaluate it
        eval "${cmd[@]}"
    fi
done <<END
 - abc(i,j,k)
END
- abc(i,j,k)
- abc(i,j,)
- abc(i,,k)
- abc(i,,)
- abc(,j,k)
- abc(,j,)
- abc(,,k)
- abc(,,)
于 2013-07-20T18:32:42.147 に答える
2

たぶん短いバージョンがあります。純粋なソリューションを追加します。

#!/bin/bash

# extract arguments to $arg
fnc=" - abc(i,j,k)"
pre=${fnc%%(*}
post=${fnc##*)}
arg=${fnc#*(}
arg=${arg%)*}

# put arguments to arr array
IFS=, read -a arr <<<"$arg"
num=${#arr[@]}

# Generate all output lines
for((i=0; i<1<<num; ++i));{
  tmp=()
  for ((j=0; j<num; ++j));{
    if ((i & (1<<j))); then tmp[j]=""
    else tmp[j]=${arr[j]}
    fi
  }
  printf -v tmp ,%s "${tmp[@]}"
  echo "$pre("${tmp:1}")$post"
}

出力:

 - abc(i,j,k)
 - abc(,j,k)
 - abc(i,,k)
 - abc(,,k)
 - abc(i,j,)
 - abc(,j,)
 - abc(i,,)
 - abc(,,)

スクリプトは変数fncを入力として使用します。pre、args、post の 3 つの部分に分かれています。はarg配列化されます。次に、可能なバリエーションごとに出力を生成します。

于 2013-07-20T14:43:28.787 に答える