就像my previous thread一样,我知道如何解析带空格的简单json.

现在我有另一个问题,如果我有多个模块 struct ,它们的键是相同的,但值是不同的,I want the output value to be a combination of the values in each module, but actually the value in the last module will overwrite the previous one.

我的测试样例JSON如下:

{
  "WorkspaceName":"aaa bbb ccc ddd eee",
  "ReportFileName":"xxx yyy zzz",
  "StageName":"sit uat prod"
},
{
  "WorkspaceName":"1111 2222 3333 4444 5555",
  "ReportFileName":"6666 7777 8888",
  "StageName":"sit1 uat1 prod1"
}

我try 过的shell 脚本mian.sh如下:

InitialFile=$WORKSPACE/deployment/configuration/Initial.json
eval $(sed -n -e 's/^.*"\(.*\)":\(".*"\).*$/\1=\2/p' $InitialFile)

ConfigFile="$WorkspaceName"_"$ReportFileName"

echo The Config File is_$ConfigFile

结果始终是The Config File is_1111 2222 3333 4444 5555_6666 7777 8888,我希望同时获得两个值:aaa bbb ccc ddd eee_xxx yyy zzz1111 2222 3333 4444 5555_6666 7777 8888.

我如何实现这一点?

来了解一下我为什么要这么做,以及我的一些局限性:

我正在Jenkins上执行我的管道,它将执行我的mian.sh.因此,条目是mian.sh.此外,Jenkins服务器由单独的团队维护,我们不能直接访问服务器,因此不能直接在服务器上运行shell 代码.

另外,我需要组合变量,以便使用该变量来匹配相应配置文件的名称.不同的结果需要匹配不同的文件以进行后续测试.

推荐答案

100

  • 由于op不能安装和使用jq,因此在这里使用awk方法.
  • 我在这里提供了3种解决方案,1st:是GNU awk方法,2nd是非GNU awk方法,3rd是从shell 脚本运行非GNU awk代码.
  • 前2个代码与awk个代码一起在终端上运行或在awk个脚本中运行
  • 然后,根据OP的请求,因为他们的代码在Jenkins中运行,所以我发布了一个shell 脚本,该脚本接受要传递给它的参数,该参数是输入文件名.
  • 要将输出保存到shell 变量中,可以在此答案的第三行代码中完成,方法是将第一行代码更改为StageName=$(awk -v RS= ' and,将第三行代码的最后一行更改为' "$1").

105带着您展示的样本,请try 以下GNU awk代码.使用GNU awkmatch函数,其中我使用正则表达式[[:space:]]+"WorkspaceName":"([^"]*)",\n[[:space:]]+"ReportFileName":"([^"]*)来获取所需的值,并从其中创建两个捕获组,它进一步将值存储到名为arr的数组中,以便稍后在需要之前获取值.

awk -v RS= '
{
  while(match($0,/[[:space:]]+"WorkspaceName":"([^"]*)",\n[[:space:]]+"ReportFileName":"([^"]*)",/,arr)){
    print arr[1]"_"arr[2]
    $0=substr($0,RSTART+RLENGTH)
  }
}
'  Input_file

103与您显示的样本,请try 以下代码,应该可以在任何POSIX awk.该解决方案也使用match函数,但它不创建数组,也不包含任何捕获组,因为捕获组功能是GNU awk的一部分.所以在这里使用split函数来拆分匹配值,并只从中获得所需的部分.

awk -v RS= '
{
  while(match($0,/[[:space:]]+"WorkspaceName":"[^"]*",\n[[:space:]]+"ReportFileName":"[^"]*",/)){
    val=substr($0,RSTART,RLENGTH)
    split(val,arr,"\"WorkspaceName\":\"|\"ReportFileName\":\"|,\n")
    sub(/"$/,"",arr[2])
    sub(/",$/,"",arr[4])
    print arr[2]"_"arr[4]
    $0=substr($0,RSTART+RLENGTH)
  }
}
'  Input_file


100

#!/bin/bash
awk -v RS= '
{
  while(match($0,/[[:space:]]+"WorkspaceName":"[^"]*",\n[[:space:]]+"ReportFileName":"[^"]*",/)){
    val=substr($0,RSTART,RLENGTH)
    split(val,arr,"\"WorkspaceName\":\"|\"ReportFileName\":\"|,\n")
    sub(/"$/,"",arr[2])
    sub(/",$/,"",arr[4])
    print arr[2]"_"arr[4]
    $0=substr($0,RSTART+RLENGTH)
  }
}
'  "$1"

Json相关问答推荐

使用Shell深入挖掘到最低的SON元素

服务器不返回JSON

如何使用JQ将JSON字符串替换为解析后的类似功能?

使用自定义类型在Golang中解析JSON数组

(Kotlin)com.google.gson.internal.LinkedTreeMap无法转换为com.example.phonetest2.model.HallData

bash用jq获取第二条JSON记录

如何避免解析 ISuperObject 类型字段中的 json 对象

使用 Powershell,如何将 Azure AD 组成员转换为 Json 对象(文件),然后可以更新?

N1QL 搜索对象内的某些对象

使用 jq 同时迭代数组

将 js Array() 转换为 JSON 对象以用于 JQuery .ajax

如何对使用转换器的 Grails 服务进行单元测试?

获取json中某个键的索引

SyntaxError:Object.parse(本机)AngularJS中的意外标记o

如何一次加载无限滚动中的所有条目以解析python中的HTML

.NET CORE 3 升级 CORS 和 Json(cycle) XMLHttpRequest 错误

Golang struct 的 XML 和 JSON 标签?

为什么 JavaScript 的 eval 需要括号来判断 JSON 数据?

使用 JSON.NET 序列化/反序列化对象字典

log4j 支持 JSON 格式吗?