将两个关键字之间的字符串替换为每行不同的随机数



我有一个json文件,其内容如下:

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"}
]

我需要做的是将这个文件转换为下面的文件

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"}
]

也就是说,在BEGIN和END关键字之间插入一个随机数,并且该随机数对于每一行都必须不同。

我试着在命令下构建

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

但结果如下:

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"}
]

它没有生成随机数,而是按原样打印$random。我该如何克服这一点?

附言:我不能使用任何第三方工具/库。我必须在bash中完成,我只能使用sed或awk,因为真正的文件有很多行,我必须非常快地完成。

提前谢谢。

您可以尝试此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"}
]

Perl来拯救!

perl -pe '$r = int(rand 9000) + 1000; s/BEGIN END/BEGIN $r END/' myjson.json
  • -p逐行读取输入,为每行运行代码并打印结果
  • 有关详细信息,请参阅rand和int,该公式会创建介于1000-9999之间的随机数

要使数字唯一,可以使用

perl -MList::Util=shuffle -pe '
BEGIN { @r = shuffle(1000 .. 9999) }; s/BEGIN END/BEGIN $r[$i++] END/
' myjson.json
  • 有关shuffle的详细信息,请参阅List::Util
  • 它首先将数字列表打乱1000。。9999,然后将打乱的数字一个接一个地插入字符串中

最新更新