将文本中的数字替换为一定范围内的随机数

将文本中的数字替换为一定范围内的随机数

现在我的文字看起来像

"xyz1"
zyx1
"http://xyz1"
zyx1
"xyz1"
zyx1

我需要1将 替换为 范围内的随机数,1-5以便输出看起来像

"xyz3"
zyx2
"http://xyz1"
zyx5
"xyz4"
zyx1

zyx或者xyz应该出现在 1 之前,以将其替换为 1-5

答案1

perl

perl -pe 's/(zyx|xyz)\K1/1+int rand 5/ge' < file

答案2

使用awks兰特()斯兰德功能:

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

每行中仅替换第一次出现的zyx1or 。xyz1如果你想全部替换可能出现的情况,将最后一个更改1"g"(全局)。

笔记:如果同一秒内多次执行该脚本,则可能会产生相同的结果。

如果省略参数 x,如“srand()”中所示,则当前日期和时间将用作种子。这是获得真正不可预测的随机数的方法。

如果您不想这样做,您可以将随机种子更改为您选择的值,例如当前时间的纳秒部分(如果您date支持此操作):

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

答案3

与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

相关内容