现在我的文字看起来像
"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
awk 'BEGIN{srand()}{print gensub(/(zyx|xyz)1/, "\\1"1 + int(rand() * 5), 1)}' file
每行中仅替换第一次出现的zyx1
or 。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