如何用awk/sed为JSON每行的BEGIN和END间插入不同随机数?
解决方案
问题原因
你之前的awk命令里,$RANDOM是Bash的环境变量,但因为awk脚本用单引号包裹,Bash不会解析这个变量;同时awk本身也不识别$RANDOM,所以它会被当作普通字符串原样输出。
高效的awk实现方法
利用awk自带的随机数生成函数rand(),配合srand()初始化随机种子,就能为每行生成不同的随机数,且处理大文件效率很高:
awk 'BEGIN{srand()}{gsub(/BEGIN\s*END/, "BEGIN " int(rand()*100000) " END")}1' myjson.json
细节说明:
BEGIN{srand()}:在处理文件前初始化随机种子,默认使用系统当前时间作为种子,确保每次运行生成的随机数序列不同。rand():生成0到1之间的浮点数,乘以100000后用int()取整,得到0-99999的5位随机数;如果需要其他位数,调整乘数即可(比如乘10000得到4位)。gsub(/BEGIN\s*END/, ...):全局替换所有BEGIN和END之间(包含可能的空格)的内容,替换为带随机数的格式。- 末尾的
1:awk的语法,等价于print $0,用于输出处理后的每行内容。
如果你的场景中BEGIN和END之间可能存在其他内容(不止空格),可以用更通用的正则匹配:
awk 'BEGIN{srand()}{gsub(/BEGIN.*?END/, "BEGIN " int(rand()*100000) " END", $0)}1' myjson.json
(可选)结合Bash和sed的实现(仅适合小文件)
如果一定要用sed,需要借助Bash循环逐行处理,但这种方法效率较低,不适合大量行的场景:
while IFS= read -r line; do sed "s/BEGIN\s*END/BEGIN $RANDOM END/" <<< "$line" done < myjson.json
内容的提问来源于stack exchange,提问作者lupus
相关产品推荐
相关产品推荐

