Awk
shell 腳本可以找到與相同正則表達式匹配的所有連續行組並將它們打亂嗎?
我正在用 Markdown 語言為我的學生寫測驗。其中一項測驗可能如下所示:
% 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
我想隨機化所有這些多項選擇選項。所以,我想我需要一個 shell 腳本:
- 查找以 (X) 或 ( ) 開頭的所有連續行塊。
- 隨機播放這些行中的每一個塊。
這可能嗎?我知道這一點
shuf
,sort -R
並將隨機化任何文本的行,但我不確定如何隔離這些選項塊。
使用 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
數組中累積答案,並在必要時以隨機順序輸出其內容來工作。如果以左括號開頭的行被認為是答案(我希望這是對您的規範的有效簡化)。