bash – replace string between two keywords with different random numbers for each line

I have got a json file whose content is like below:

cat myjson.json
[
    {"a":"1", "b":"c BEGIN END"},
    {"a":"2", "b":"d BEGIN END"},
    {"a":"3", "b":"e BEGIN END"},
    {"a":"4", "b":"f BEGIN END"}
]

What I need to do is transform this file to something like below

cat myjson.json
[
    {"a":"1", "b":"c BEGIN 12341 END"},
    {"a":"2", "b":"d BEGIN 43234 END"},
    {"a":"3", "b":"e BEGIN 53474 END"},
    {"a":"4", "b":"f BEGIN 54236 END"}
]

That is, inserting a random number between BEGIN and END keywords and this random number have to be different for each line.

I tried constructing below command

awk '{$0=gensub(/BEGIN(.*?)END/, "BEGIN $RANDOM END", "g", $0)}1' myjson.json

but the result is like below:

awk '{$0=gensub(/BEGIN(.*?)END/, "BEGIN $RANDOM END", "g", $0)}1' myjson.json
[
    {"a":"1", "b":"c BEGIN $RANDOM END"},
    {"a":"2", "b":"d BEGIN $RANDOM END"},
    {"a":"3", "b":"e BEGIN $RANDOM END"},
    {"a":"4", "b":"f BEGIN $RANDOM END"}
]

Instead of generating random number, it printed $RANDOM as is. How can I overcome this?

PS: I cannot use any third party tools/libraries. I have to do it in bash and I can only use sed or awk because real file has a lot of lines and I have to do it very fast.

Thanks in advance.

>Solution :

You may try this awk:

awk '
function rnd() { # generates random num between 10K and 100K
   return int(rand()*100000-1)+10000
}
BEGIN { srand() } # seed the random
{
   print gensub(/(BEGIN)\s+(END)/, "\\1 " rnd() " \\2", "1")
}' file.json

[
    {"a":"1", "b":"c BEGIN 70514 END"},
    {"a":"2", "b":"d BEGIN 99405 END"},
    {"a":"3", "b":"e BEGIN 32648 END"},
    {"a":"4", "b":"f BEGIN 75761 END"}
]

Leave a Reply