Javascript 在生成的GUID值上链接json对象
我正在寻找一种方法来自动化在随机guid上链接多个JSON对象这一单调乏味的工作 有几个相互关联的JSON格式文件:Javascript 在生成的GUID值上链接json对象,javascript,python,json,npm,awk,Javascript,Python,Json,Npm,Awk,我正在寻找一种方法来自动化在随机guid上链接多个JSON对象这一单调乏味的工作 有几个相互关联的JSON格式文件: { "name": "some.interesting.name", "description": "helpful description", "instanceId": "random-GUID.for.some.interesting.nam
{
"name": "some.interesting.name",
"description": "helpful description",
"instanceId": "random-GUID.for.some.interesting.name",
"policies": [
{
"name": "some.interesting.name-policy",
"instanceId": "random-GUID.for.some.interesting.name-policy"
}
],
"attributes": [
"one": {
"ref": "!some.interesting.name-2#random-GUID.for.some.interesting.name-2"
}
]
}
这些名称是静态的和可读的。
文件位置是静态的,并遵循名称结构
每当开发人员对任何文件进行最微小的更改时,InstanceId都需要更改。
正在寻找一个工具,或者关于如何编写一个工具的想法,以便在集合中的每个文件的正确位置随机生成和插入guid
注意:我们正在成功地使用生成GUID,因此解决了随机值的问题
提供一个最小的可测试示例。
输入将是配置目录及其下的所有文件
策略文件:
配置/policy/my_policy.js
{
"name" : "policy.my_policy"
"instanceId": "{$policy.my_policy}"
"assets": [
{
"user-info": "!assets.current_user_info#{$assets.current_user_info}"
},
]
"commands": [
{
"update-user": "!commands.update_admin_user#{$commands.update_admin_user}"
}
]
}
{
"name" : "policy.my_policy"
"instanceId": "b35970fe-96dd-481d-a244-8880cc0cb818"
"assets": [
{
"user-info": "!assets.current_user_info#c3a17d65-921d-4cc4-9e23-5d40bd519289}"
},
]
"commands": [
{
"update-user": "!commands.update_admin_user#52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd"
}
]
}
配置/资产/当前用户\u info.js
{
"name" : "assets.current_user_info"
"instanceId": "{$assets.current_user_info}"
"attribute": {
"type": "string",
"value": "admin"
}
}
{
"name" : "assets.current_user_info"
"instanceId": "c3a17d65-921d-4cc4-9e23-5d40bd519289"
"attribute": {
"type": "string",
"value": "admin"
}
}
配置/命令/更新\u admin\u user.js
{
"name" : "commands.update_admin_user"
"instanceId": "{$commands.update_admin_user}"
"inputType": {
"name": "assets.current_user_info"
"instanceId": "{$assets.current_user_info}"
}
}
{
"name" : "commands.update_admin_user"
"instanceId": "52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd"
"inputType": {
"name": "assets.current_user_info"
"instanceId": "c3a17d65-921d-4cc4-9e23-5d40bd519289"
}
}
输出将是相同的文件,可能复制到同一文件夹结构中的输出目录,
变量在哪里
$assets.current_user_info
$commands.update_admin_user
$policy.my_policy
在使用npm nanoid或类似库生成的所有文件中,都用GUID值替换
策略文件:
配置/policy/my_policy.js
{
"name" : "policy.my_policy"
"instanceId": "{$policy.my_policy}"
"assets": [
{
"user-info": "!assets.current_user_info#{$assets.current_user_info}"
},
]
"commands": [
{
"update-user": "!commands.update_admin_user#{$commands.update_admin_user}"
}
]
}
{
"name" : "policy.my_policy"
"instanceId": "b35970fe-96dd-481d-a244-8880cc0cb818"
"assets": [
{
"user-info": "!assets.current_user_info#c3a17d65-921d-4cc4-9e23-5d40bd519289}"
},
]
"commands": [
{
"update-user": "!commands.update_admin_user#52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd"
}
]
}
配置/资产/当前用户\u info.js
{
"name" : "assets.current_user_info"
"instanceId": "{$assets.current_user_info}"
"attribute": {
"type": "string",
"value": "admin"
}
}
{
"name" : "assets.current_user_info"
"instanceId": "c3a17d65-921d-4cc4-9e23-5d40bd519289"
"attribute": {
"type": "string",
"value": "admin"
}
}
配置/命令/更新\u admin\u user.js
{
"name" : "commands.update_admin_user"
"instanceId": "{$commands.update_admin_user}"
"inputType": {
"name": "assets.current_user_info"
"instanceId": "{$assets.current_user_info}"
}
}
{
"name" : "commands.update_admin_user"
"instanceId": "52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd"
"inputType": {
"name": "assets.current_user_info"
"instanceId": "c3a17d65-921d-4cc4-9e23-5d40bd519289"
}
}
输入:
$ cat vars2guids
$assets.current_user_info c3a17d65-921d-4cc4-9e23-5d40bd519289
$commands.update_admin_user 52a9a82e-a4e4-42f1-8376-a4e5ac06c9bd
$policy.my_policy b35970fe-96dd-481d-a244-8880cc0cb818
$ find configuration -type f -name '*.js'
configuration/assets/current_user_info.js
configuration/commands/update_admin_user.js
configuration/policy/my_policy.js
$ head -n 50 $(find configuration -type f -name '*.js')
==> configuration/assets/current_user_info.js <==
{
"name" : "assets.current_user_info"
"instanceId": "{$assets.current_user_info}"
"attribute": {
"type": "string",
"value": "admin"
}
}
==> configuration/commands/update_admin_user.js <==
{
"name" : "commands.update_admin_user"
"instanceId": "{$commands.update_admin_user}"
"inputType": {
"name": "assets.current_user_info"
"instanceId": "{$assets.current_user_info}"
}
}
==> configuration/policy/my_policy.js <==
{
"name" : "policy.my_policy"
"instanceId": "{$policy.my_policy}"
"assets": [
{
"user-info": "!assets.current_user_info#{$assets.current_user_info}"
},
]
"commands": [
{
"update-user": "!commands.update_admin_user#{$commands.update_admin_user}"
}
]
}
完成初始测试后,从#>“$tmp”和&mv--“$tmp”“$file”
中删除#
,使原始文件由工具更新,而不是仅打印到标准输出
要创建vars2guids
文件,请为.js文件中找到的每个变量生成一个guid,并假设变量在{…}
中始终看起来像$word chars.word chars
,其他任何变量都不是这样的:
vars=( $(find configuration -type f -name '*.js' -exec awk '
{
while ( match($0,/\{\$[[:alnum:]_]+\.[[:alnum:]_]+}/) ) {
print substr($0,RSTART+1,RLENGTH-2)
$0 = substr($0,RSTART+RLENGTH)
}
}
' {} + | sort -u) )
for var in "${vars[@]}"; do
guid=$(echo "$RANDOM")
printf '%s\t%s\n' "$var" "$guid"
done # > vars2guids
以上将输出:
$assets.current_user_info 29283
$commands.update_admin_user 28057
$policy.my_policy 1187
将echo“$RANDOM”更改为运行以生成GUID的任何命令。取消对#>vars2guids
的注释,使其将输出写入vars2guids
,而不是stdout
因此,在所有测试之后,您的脚本可能如下所示:
$ cat tst.sh
#!/usr/bin/env bash
tmp=$(mktemp) || exit 1
vars=( $(find configuration -type f -name '*.js' -exec awk '
{
while ( match($0,/\{\$[[:alnum:]_]+\.[[:alnum:]_]+}/) ) {
print substr($0,RSTART+1,RLENGTH-2)
$0 = substr($0,RSTART+RLENGTH)
}
}
' {} + | sort -u) )
for var in "${vars[@]}"; do
guid=$(echo "$RANDOM")
printf '%s\t%s\n' "$var" "$guid"
done > vars2guids
while IFS= read -r file; do
printf '\n###########\nUpdating %s\n' "$file" >&2
awk '
NR==FNR { v2g[$1]=$2; next }
{
for (var in v2g) {
if ( s=index($0,var) ) {
guid = v2g[var]
$0 = substr($0,1,s-1) guid substr($0,s+length(var))
}
}
print
}
' vars2guids "$file" > "$tmp" && mv -- "$tmp" "$file"
done < <(find configuration -type f -name '*.js')
$cat tst.sh
#!/usr/bin/env bash
tmp=$(mktemp)| |退出1
vars=($(查找配置-类型f-名称'*.js'-exec awk'
{
while(匹配($0,/\{\$[:alnum:][uh]+\.[:alnum:][uh]+}/){
打印子文件($0,RSTART+1,RLENGTH-2)
$0=substr($0,RSTART+RLENGTH)
}
}
“{}+|sort-u))
对于“${vars[@]}”中的变量;做
guid=$(回显“$RANDOM”)
printf“%s\t%s\n”$var“$guid”
完成>vars2guids
而IFS=read-r文件;做
打印“\n”更新%s\n“$file”>&2
awk'
NR==FNR{v2g[$1]=$2;next}
{
用于(v2g中的var){
如果(s=指数($0,var)){
guid=v2g[var]
$0=substr($0,1,s-1)guid substr($0,s+length(var))
}
}
打印
}
'vars2guids“$file”>“$tmp”和&mv--“$tmp”$file”
done<这里是一个Python脚本,它使用uuid.uuid4()为InstanceId生成GUI并填充所有文件中的值。文件从src/复制到output/,具有相同的目录结构。
使用python3
# Import the os module, for the os.walk function
import os
import re
import uuid
# Set the directory you want to start from
rootDir = 'src'
outputDir = 'output'
pattern = re.compile("{\$((\w*\.)*(\w)*)}")
instanceId = set([])
def findInstanceIdName(fileName):
# print("Looking for instanceIds in " + fileName);
found = [];
for i, line in enumerate(open(fileName)):
for match in re.finditer(pattern, line):
found_match = match.group();
found.append(found_match);
return found;
def generateInstanceIdValue(nameList):
values = {}
for instanceName in nameList:
values[instanceName] = str(uuid.uuid4());
return values;
def processFile(inputFileName, outputFileName, instanceIdValues):
with open(inputFileName, "r") as inputFile, open(outputFileName, "w") as outputFile:
line = inputFile.read();
# print("Found line: <" + line + ">");
for key in instanceIdValues.keys():
line = line.replace(key, instanceIdValues[key]);
outputFile.write(line);
for dirName, subdirList, fileList in os.walk(rootDir):
# print('Found directory: %s' % dirName)
for fname in fileList:
fullFileName = dirName + "/" + fname;
instanceId.update(findInstanceIdName(fullFileName));
instanceIdValues = generateInstanceIdValue(instanceId);
#print(instanceIdValues);
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
outputDirName = outputDir + dirName[len(rootDir):];
os.makedirs(outputDirName, exist_ok=True);
fullFileName = dirName + "/" + fname;
outputFileName = outputDir + fullFileName[len(rootDir):];
processFile(fullFileName, outputFileName, instanceIdValues);
#为os.walk函数导入操作系统模块
导入操作系统
进口稀土
导入uuid
#设置要从中开始的目录
rootDir='src'
outputDir='output'
pattern=re.compile(“{\$(\w*\)*(\w)*)}”)
instanceId=set([])
def FindInstancedName(文件名):
#打印(“在“+文件名”中查找实例ID);
发现=[];
对于i,枚举(打开(文件名))中的行:
对于re.FindItem中的匹配(模式、行):
找到_match=match.group();
找到。追加(找到匹配项);
发现退货;
def generateInstanceIdValue(名称列表):
值={}
对于名称列表中的instanceName:
值[instanceName]=str(uuid.uuid4());
返回值;
def processFile(inputFileName、outputFileName、InstanceIdValue):
使用open(inputFileName,“r”)作为inputFile,open(outputFileName,“w”)作为outputFile:
line=inputFile.read();
#打印(“找到行:”);
对于instanceIdValues.keys()中的键:
line=line.replace(key,instanceidvalue[key]);
outputFile.write(行);
对于os.walk(rootDir)中的dirName、subdirList和fileList:
#打印('找到的目录:%s'%dirName)
对于文件列表中的fname:
fullFileName=dirName+“/”+fname;
update(findInstanceIdName(fullFileName));
instanceIdValues=generateInstanceIdValue(instanceId);
#打印(实例值);
对于os.walk(rootDir)中的dirName、subdirList和fileList:
对于文件列表中的fname:
outputDirName=outputDir+dirName[len(rootDir):];
os.makedirs(outputDirName,exist_uOK=True);
fullFileName=dirName+“/”+fname;
outputFileName=outputDir+fullFileName[len(rootDir):];
processFile(fullFileName、outputFileName、InstanceIdValue);
花了一些时间研究如何读取并查找该片段中的输出。。。为此构建了一个python脚本,看起来更简单。谢谢你的帮助!你的剧本很有帮助。