shell解析json并循环输出组合变量

2024-05-27

杰斯克喜欢我之前的话题 https://stackoverflow.com/questions/74063588/shell-parsing-json-contains-spaces-in-string,我知道如何解析带有空格的简单 json。

现在我还有一个问题是,如果我有多个模块结构,它们的键是相同的,但值是不同的,我希望输出值是每个模块中的值的组合,但实际上最后一个模块中的值将覆盖前一个模块中的值。

我的测试示例 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"
}

和我尝试过的 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 zzz and 1111 2222 3333 4444 5555_6666 7777 8888.

我该如何实现这一目标?

一点背景了解我为什么这样做以及我的一些限制:

我正在 jenkins 上执行我的管道,它将执行我的 mian.sh。所以条目是mian.sh。另外,jenkins服务器是由独立团队维护的,我们无法直接访问服务器,因此无法直接在服务器上运行shell代码。

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


这个答案的要点:

  • 由于OP无法安装和使用jq所以去awk接近这里。
  • 我在这里提供了3种解决方案,1st: is GNU awk方法和2nd是非 GNUawk方法和3rd一个正在运行非 GNUawk来自 shell 脚本的代码。
  • 第 2 个代码是并列的awk在终端上运行的代码或在awk script
  • 然后按照OP的要求,因为他们的代码正在运行Jenkins我发布了一个 shell 脚本,它接受一个参数,该参数是要传递给它的 Input_file 名称。
  • 要将输出保存到 shell 变量中,可以在这个答案的第三个代码中将第一行更改为StageName=$(awk -v RS= ' and将第三行代码的最后一行更改为' "$1").

第一个解决方案:使用您显示的示例,请尝试以下操作GNU awk代码。使用matchGNU 的功能awk我在哪里使用正则表达式[[:space:]]+"WorkspaceName":"([^"]*)",\n[[:space:]]+"ReportFileName":"([^"]*)获取所需的值并从中创建 2 个捕获组,进一步将值存储到名为的数组中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

第二个解决方案:对于您显示的示例,请尝试以下代码,应该可以在任何 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


要从 shell 脚本运行代码,请尝试:

#!/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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell解析json并循环输出组合变量 的相关文章

随机推荐