如何从bash填充/更改格式良好的JSON文件的某些部分的特定未知字符串,保持格式不变?

如何从bash填充/更改格式良好的JSON文件的某些部分的特定未知字符串,保持格式不变?,json,bash,Json,Bash,如何从bash中填充/更改格式良好的.json文件的某些部分的特定未知字符串,保持格式完整 详情: settings.json的一部分: “配置文件”: { “默认值”: { //在此处放置要应用于所有配置文件的设置。 }, “主题”:“黑暗”, “名单”: [ { //在此对powershell.exe配置文件进行更改。 “guid”:“{61c54bbd-c2c6-5271-96e7-009a87ff44bf}”, “名称”:“Windows PowerShell”, “命令行”:“powe

如何从bash中填充/更改格式良好的.json文件的某些部分的特定未知字符串,保持格式完整

详情:

settings.json的一部分:

“配置文件”:
{
“默认值”:
{
//在此处放置要应用于所有配置文件的设置。
},
“主题”:“黑暗”,
“名单”:
[
{
//在此对powershell.exe配置文件进行更改。
“guid”:“{61c54bbd-c2c6-5271-96e7-009a87ff44bf}”,
“名称”:“Windows PowerShell”,
“命令行”:“powershell.exe”,
“隐藏”:假,
“丙烯产能”:0.9,
“配色方案”:“材质”,
“光标颜色”:“FFFFF D”,
“使用丙烯酸”:正确
},
{
//在此处对cmd.exe配置文件进行更改。
“guid”:“{0caa0dad-35be-5f56-a8ff-afceeeaa6101}”,
“名称”:“命令提示符”,
“命令行”:“cmd.exe”,
“隐藏”:假,
“丙烯产能”:0.2,
“配色方案”:“霜冻”,
“光标颜色”:“#000000”,
是的,
},
“计划”:[
{
“名字”:“弗罗斯特”,
“背景”:“ffffff”,
“黑色”:“3C5712”,
“蓝色”:“17b2ff”,
“亮黑”:“749B36”,
“亮蓝”:“#27B2F6”,
“亮蓝”:“13A8C0”,
“亮绿”:“89AF50”,
“亮紫色”:“F2A20A”,
“亮红色”:“F49B36”,
“亮白”:“741274”,
“亮黄色”:“#991070”,
“青色”:“3C96A6”,
“前景”:“000000”,
“绿色”:“#6AAE08”,
“紫色”:“#991070”,
“红色”:“8D0C0C”,
“白色”:“6E386E”,
“黄色”:“#991070”
},
另一个文件
pickcolor.txt

#FFFAFA
#FFFAFA
#EEE9E9
#FFC1C1
#EEB4B4
#CDC9C9
#F08080
#FF6A6A
#CD9B9B
#EE6363
#BC8F8F
#FF4040
#FF3030
#EE3B3B
#CD5C5C
#CD5555
#EE2C2C
#8B8989
#CD3333
#FF0000
#FF0000
#8B6969
#CD2626
#EE0000
#B22222
#A52A2A
#CD0000
#8B3A3A
#8B2323
创建一个bash,将
“background”
“cursorColor”
等字段的值更改为
pickcolor.txt

我面临的要求/问题:

  • 多次出现的字段彼此获取不同的值
  • 字段的值会不时变化,所以简单的查找和替换不起作用
  • 每次添加新内容时,字段的行号都会更改,所以字段的行号不会保持不变
  • .json文件的格式不应更改

  • 请注意:我不希望任何人编写完整的代码;只要提示/指出方法就足够了。请提前感谢!!

    我相信您需要的是这样的东西

    fields=(背景光标或颜色)
    颜色=(“FFFAFA”“CDC9C9”“EE3B3B”)
    大小=${#颜色[@]}
    对于“${fields[@]}”中的f,请执行以下操作
    对于$(grep-n“\“$f\”myfile.json | cut-f1-d:)中的行,执行以下操作
    索引=$($RANDOM%$size))
    color=“${colors[$index]}”
    sed-i$line的| \(““$f””\s*:\s*“\)。\+“|\1'$color”“|”myfile.json
    完成
    完成
    
    这个解决方案有一些魔力:

  • 我们从颜色数组中选择随机索引
  • 对于每个应该被替换的字段,我们创建它自己独特的sed表达式
  • 第一部分(
    \(“$f””\s*:\s*“\)。\+“
    找到任何匹配模式的内容
    :”
  • 将第三个双引号之前的任何内容捕获到组中
  • 在第二个组(
    \1'“${colors[$index]}”'”
    )中,将匹配的部分替换为自身,但将从数组中随机选取的颜色插入到第二个双引号组中
  • 有很多引号的奇怪东西被用来在单引号中插入字段名和颜色

  • 注意:这是用GNU sed测试的。BSD可能需要一些不同的语法。对不起,您到底需要什么?您需要用列表中的随机颜色替换任何类似颜色的字符串吗?或者您需要用列表中的随机颜色更改具有特定名称的字段的值吗?@asm0dey需要用rand更改具有特定名称的字段的值om列表中的颜色然后看起来我的答案应该适合您。请将其标记为正确,如果不适合您,请进行评论。谢谢帮助。它确实会按预期替换颜色,但如果该字段在文件中出现多次,我希望同一字段获得不同的值。@Madhubala请向我们提供更多信息关于您的文件是如何组织的。我们可以说每行只有一个匹配项吗?很抱歉不明确。将要求您假设共享json文件是完整的。您上面提供的代码按预期工作,但唯一的问题是-例如,如果第一次将“cursorColor”设置为红色,则第二次将其设置为除此之外的任何其他值红色。谢谢您的时间。@Madhubala然后解决方案保持不变,但首先您需要找到所有匹配行的编号,并对每行执行替换。@Madhubala您能检查一下吗?