заменить число в тексте на случайное число в диапазоне

Попробуйте использовать встроенную -в оболочке zsh команду wait-, она сделает всю работу за вас.

% date; sleep 30s &
Tue Aug  8 22:24:07 EDT 2017
[1] 31875
% wait %1; date
[1]  + done       sleep 30s
Tue Aug  8 22:24:37 EDT 2017

Вы также можете использовать PID вместо спецификации задания -выше. Итак,:

% date; sleep 30s &
Tue Aug  8 22:26:04 EDT 2017
[1] 1821
% wait 1821; date
[1]  + done       sleep 30s
Tue Aug  8 22:26:34 EDT 2017

Семантика в bash такая же.

0
07.12.2019, 18:47
3 ответа

Использование awks ранд()и srand функции:

awk 'BEGIN{srand()}{print gensub(/(zyx|xyz)1/, "\\1"1 + int(rand() * 5), 1)}' file

В каждой строке заменяется только первое вхождение zyx1или xyz1. Если вы хотите заменить все возможные вхождения, измените последнее 1на"g"(глобальное ).

Примечание.:Если скрипт выполняется несколько раз в одну и ту же секунду, он может дать один и тот же результат.

If the argument x is omitted, as in ‘srand()’, then the current date and time of day are used for a seed. This is the way to get random numbers that are truly unpredictable.

Если вы этого не хотите, вы можете изменить случайное начальное число на значение по вашему выбору, например наносекундную часть текущего времени, если ваш dateподдерживает это:

seed=$(date '+%N')
awk -v s="$seed" 'BEGIN{srand(s)}{print gensub(/(zyx|xyz)1/, "\\1"1 + int(rand() * 5), 1)}' file
1
28.01.2020, 02:21

Сperl:

perl -pe 's/(zyx|xyz)\K1/1+int rand 5/ge' < file
2
28.01.2020, 02:21

При вызове GNUawkкомандыshuf:

awk 'BEGIN{ cmd="shuf -i 1-5 -n1" }
     { cmd | getline num; close(cmd); sub("1", num) }1' file

Выход:

"xyz3"
zyx4
"http://xyz2"
zyx5
"xyz1"
zyx2
0
28.01.2020, 02:21

Теги

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