就像我以前的執行緒一樣,我知道如何用空格決議簡單的 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和1111 2222 3333 4444 5555_6666 7777 8888。
我如何實作這一目標?
了解我為什么要這樣做以及我的一些局限性的一點背景:
我正在jenkins上執行我的管道,它將執行我的mian.sh。所以入口是mian.sh。另外,jenkins服務器是由單獨的團隊維護的,我們不能直接訪問服務器,所以不能直接在服務器上運行shell代碼。
另外,我需要組合變數,以便使用這個變數來匹配相應組態檔的名稱。不同的結果需要匹配不同的檔案進行后續測驗。
uj5u.com熱心網友回復:
此答案的要點:
- 由于 OP 無法安裝和使用
jq,因此awk這里采用一種方法。 - 我在這里提供了 3 個解決方案,第一個:是 GNU
awk方法,第二個是非 GNUawk方法,第三awk個是從 shell 腳本運行非 GNU代碼。 - 第 2 個代碼是
awk在終端上運行的代碼或在awk腳本中運行的代碼 - 然后根據 OP 的要求,因為他們的代碼正在運行,
Jenkins所以我發布了一個 shell 腳本,它接受一個引數,該引數是要傳遞給它的 Input_file 名稱。 - 要將輸出保存到 shell 變數中,可以通過將第 1 行更改為
StageName=$(awk -v RS= '并將第 3 代碼的最后一行更改為' "$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"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521140.html
