Может ли сценарий оболочки найти все группы последовательных строк, соответствующих одному и тому же регулярному выражению, и перемешать их?

Думаю, вам нужно использовать OpenSSL, чтобы подключиться к серверу и посмотреть, какие шифры возвращаются.

Попробуйте

openssl s_client -connect ldapserver.domain:636

Должна быть возвращена строка для "Шифры"

0
06.01.2021, 11:37
4 ответа

Использование 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и вывода его содержимого в случайном порядке, когда это необходимо. Строки считаются ответами, если они начинаются с открывающей скобки (Я надеюсь, что это правильное упрощение вашей спецификации ).

5
18.03.2021, 22:38

перл:

perl -F'\n' -MList::Util=shuffle -pal -00e '$"=$\;
  $_ = "@{[/^\([X ]\)/ ? shuffle(@F) : @F]}"
    . ($", $,)[eof];
' file
  • вызов в режиме абзаца -00 и авторазбиение -параграфа на новую строку -F'\n', поля сохраняются в массиве с нулевым индексом @F
  • Загрузите список ::Util module -M и из него импортируйте функцию перемешивания.
  • Для абзаца, начинающегося с (X )или (), мы перемешиваем поля, а для других абзацев — нет.

Сед ГНУ

sed -ne '
  /^([X ])/!{p;d;}       ;# just print noninteresting lines
  :loop 
    H;$bshfl           # accumulate the interesting lines in hold space 
    n
  //bloop
  :shfl
  x;s/.//       ;# retrieve hold n strip leading newline 
  s/.*/printf %s\\n "&" | shuf/ep  ;# shuffle 
  z;x;/^([X ])/!s/^/\n/;D   ;# null hold n loop back for more 
' file

Вывод:текущего прогона

% QUESTION
Who played drums for The Beatles?

( ) John
( ) Georgen
( ) Paul
(X) Ringo

% QUESTION
What is the first line of MOBY DICK?

( ) eggsn
(X) Call me Ishmael.
( ) bar
( ) spam
( ) foo
1
18.03.2021, 22:38

Это perlбыло бы дословным переводом предмета вашего вопроса:

perl -MList::Util=shuffle -0777 -pe'
   s{(?:^\([X ]\).*\n)+}{
     join "", shuffle $& =~ /.*\n/g
   }gme' < file

Он sзаменяет каждую последовательность из одной или нескольких(+)строк, соответствующих ^\([X ]\).*\n, строками(.*\n)из , которые($&)suffled.

Для подхода с использованием GNUsort -R:

<file awk '/^\([X ]\)/{if(y)n++;x=1};{y=x;x=0;print NR-n"\t"$0}' |
  sort -k1,1n -k1R |
  cut -f2-

awkукрашает ввод как:

1       % QUESTION
2       Who played drums for The Beatles?
3
4       (X) Ringo
4       ( ) John
4       ( ) Paul
4       ( ) George
5
6       % QUESTION
7       What is the first line of MOBY DICK?
8
9       (X) Call me Ishmael.
9       ( ) foo
9       ( ) bar
9       ( ) spam
9       ( ) eggs

Затем sortсначала сортирует по первому полю и разрешает ничью случайным образом.

0
18.03.2021, 22:38

Просто передайте строки, которые вы хотите перетасовать, в shufи распечатайте остальные, как -:

$ awk '/^\(/{print | "shuf"; next} !NF{close("shuf")} 1' file
% QUESTION
Who played drums for The Beatles?

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

% QUESTION
What is the first line of MOBY DICK?

(X) Call me Ishmael.
( ) foo
( ) spam
( ) eggs
( ) bar
0
18.03.2021, 22:38

Теги

Похожие вопросы