gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:02:11 30 4
gpt4 key购买 nike

Jusk喜欢my previous thread ,我知道如何解析带有空格的简单 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

结果始终是配置文件是_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代码。

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

最佳答案

此答案的要点:

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

第一个解决方案:根据显示的示例,请尝试以下 GNU awk 代码。使用 GNU awkmatch 函数,其中我使用正则表达式 [[: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"

关于json - shell解析json并循环输出组合变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74135432/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com