这个答案的要点:
- 由于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
代码。使用match
GNU 的功能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"