我有一系列包含鍵值對的 JSON 字串,其結構如下。請注意,某些值可以為空白或包含空格。
"result":"guid=guid1;forename=Jimmy Harry;surname=Jones;birthdate=20220201"
"result":"guid=guid2;forename=Sarah-Smith;middlename=,surname=Jones;birthdate=20220201"
我想僅使用帶有 macOS 的 Bash 3.2 將鍵值對決議為一個陣列,因此我可以遍歷陣列以獲取給定的鍵。例如,假設下面的陣列是從字串中決議出來的
[guid=guid1,forename=Jimmy,middlename=,surname=Jones,birthdate=20220201]
我想獲得給定鍵的值,而不是遍歷每個陣列項并檢查鍵是否等于我要查找的值。在 Java 中,您可以根據鍵獲取值,但不確定我如何在 Bash 3 中執行此操作。
這是我迄今為止嘗試過的,但它不允許我檢查每個 kv 對,因為計數器不會增加。只有像 "${array[2]}" 這樣的索引的直接參考才有效。
array=($(echo "$result" | tr ';' '\n'))
counter=0
for item in $array
do
if [[ $item == "forename*" ]]
then
echo "${item[counter]}"
fi
echo $((counter ))
done
uj5u.com熱心網友回復:
聽起來您想使用 BASH 關聯陣列,但直到 BASH 版本 4 才引入這些陣列。此外,使用適當的 JSON 決議器可能是更好的方法,但 JSON 字串的格式可能仍然難以管理。如果您可以控制上游 JSON 生成,將輸出格式更改為更容易決議的格式將是理想的。
綜上所述,一種選擇可能是使用awk. 這種方法依賴于將源資料中的逗號替換為分號,因為源資料中的第二個 json 字串具有middlename=,surname...如下實作的決議各個欄位要求資料字串以分號分隔。
要處理的資料檔案:
$ cat t.dat
"result":"guid=guid1;forename=Jimmy Harry;surname=Jones;birthdate=20220201"
"result":"guid=guid2;forename=Sarah-Smith;middlename=,surname=Jones;birthdate=20220201"
決議awk:
search_str="guid"; awk -F":" -v sstr="$search_str" '{
gsub(",",";",$0);
gsub("\"","",$0);
split($2,a,";");
for(i in a) if (a[i] ~ sstr) {
split(a[i],b,"="); print b[2]}
}' t.dat
詳細資訊:
search_str="guid"; awk -F":" -v sstr="$search_str" 使用要搜索的字串設定 bash 變數并將其作為 awk 變數傳遞給 awk。在冒號上拆分每條記錄。
gsub(",",";",$0);將所有逗號換成分號。
gsub("\"","",$0);洗掉雙引號。
split($2,a,";");將第二個欄位拆分為以
a分號命名的陣列。
for(i in a) if (a[i] ~ sstr)遍歷a陣列并搜索指定的搜索字串。
split(a[i],b,"="); print b[2]如果找到搜索字串,則將a陣列項拆分為b等號陣列并列印b陣列中的第二項。
$search_str使用 bash 變數的不同值來搜索各種值的示例用法:
$ search_str="guid"; awk -F":" -v sstr="$search_str" '{
gsub(",",";",$0);
gsub("\"","",$0);
split($2,a,";");
for(i in a) if (a[i] ~ sstr) {
split(a[i],b,"="); print b[2]}
}' t.dat
guid1
guid2
$ search_str="surname"; awk -F":" -v sstr="$search_str" '{
gsub(",",";",$0);
gsub("\"","",$0);
split($2,a,";");
for(i in a) if (a[i] ~ sstr) {
split(a[i],b,"="); print b[2]}
}' t.dat
Jones
Jones
$ search_str="forename"; awk -F":" -v sstr="$search_str" '{
gsub(",",";",$0);
gsub("\"","",$0);
split($2,a,";");
for(i in a) if (a[i] ~ sstr) {
split(a[i],b,"="); print b[2]}
}' t.dat
Jimmy Harry
Sarah-Smith
$ search_str="birthdate"; awk -F":" -v sstr="$search_str" '{
gsub(",",";",$0);
gsub("\"","",$0);
split($2,a,";");
for(i in a) if (a[i] ~ sstr) {
split(a[i],b,"="); print b[2]}
}' t.dat
20220201
20220201
$ search_str="middlename"; awk -F":" -v sstr="$search_str" '{
gsub(",",";",$0);
gsub("\"","",$0);
split($2,a,";");
for(i in a) if (a[i] ~ sstr) {
split(a[i],b,"="); print b[2]}
}' t.dat
*注意為middlename第二個 json 字串輸出空行,因為有中間名鍵但沒有值。
根據 OP 的評論進行更新,這里是 BASH 腳本中的用法,而不將 JSON 存盤在檔案中:
存盤在變數中的源 JSON 字串與搜索字串一起傳遞給腳本
$ result='"result":"guid=guid2;forename=Sarah-Smith;middlename=,surname=Jones;birthdate=20220201"'
buck:t_dir buck$ ./script guid "$result"
guid2
源 JSON 字串與搜索字串一起直接傳遞給腳本:
$ ./script guid '"result":"guid=guid2;forename=Sarah-Smith;middlename=,surname=Jones;birthdate=20220201"'
guid2
腳本內容:
#!/bin/bash
# use first parameter passed to script as 'search_str'
# to be searched for in JSON
search_str="${1}";
# use second parameter passed to script as
# the JSON string to be searched
src_json="${2}"
echo "$src_json" | awk -F":" -v sstr="$search_str" '{
gsub(",",";",$0);
gsub("\"","",$0);
split($2,a,";");
for(i in a) if (a[i] ~ sstr) {
split(a[i],b,"="); print b[2]}
}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/512198.html
標籤:数组细绳重击解析核心价值
