shell 脚本可以找到匹配相同正则表达式的所有连续行组并将它们打乱吗?

Bri*_*ick 0 sed awk perl sort shuf

我正在用降价语言为我的学生编写测验。其中一个测验可能如下所示:

% 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
Run Code Online (Sandbox Code Playgroud)

我想随机化所有这些多项选择选项。所以,我想我需要一个 shell 脚本:

  1. 查找以 (X) 或 ( ) 开头的所有连续行块。
  2. 将这些行块中的每一个打乱。

这可能吗?我知道,shufsort -R会随机的任何文本的线,但我不知道如何去隔离的选择这些块。

Ste*_*itt 5

使用 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) }
Run Code Online (Sandbox Code Playgroud)

这通过在answers数组中累积答案并在必要时以随机顺序输出其内容来工作。如果行以左括号开头,则被认为是答案(我希望这是对规范的有效简化)。