シェルスクリプトが同じ正規表現に一致するすべての連続行グループを見つけて混在させることはできますか?

シェルスクリプトが同じ正規表現に一致するすべての連続行グループを見つけて混在させることはできますか?

私はマークダウンで学生のためのクイズを書いています。テストの1つは次のとおりです。

% QUESTION
Who played drums for The Beatles?

(X) Ringo
( ) John
( ) Paul
( ) George

% QUESTION
What is the first line of MOBY DICK?

(X) Call me Ishmael.
( ) foo
( ) bar
( ) spam
( ) eggs

私はこのすべての選択肢オプションをランダムに選択したいと思います。だからシェルスクリプトが必要だと思います。

  1. (X)または()で始まる連続した行ブロックをすべて見つけます。
  2. これらの各行ブロックをスクランブルします。

可能ですか?私はこれを知り、shufテキストsort -R行をランダムに選択しますが、これらのオプションブロックを分離する方法がわかりません。

ベストアンサー1

AWKを使用:

BEGIN {
    srand()
    answers[1] = ""
    delete answers[1]
}

function outputanswers(answers, len, i) {
    len = length(answers)
    while (length(answers) > 0) {
        i = int(rand() * len + 1)
        if (answers[i]) {
            print answers[i]
        }
        delete answers[i]
    }
}

/^$/ {
    outputanswers(answers)
    print
}

/^[^(]/

/^\(/ {
    answers[length(answers) + 1] = $0
}

END { outputanswers(answers) }

答えを配列に蓄積しanswers、必要に応じてその内容をランダムな順序で出力するように動作します。行が開かれているかっこで始まると、答えと見なされます(これはあなたの仕様を効果的に単純化することを願っています)。

おすすめ記事