我正在尋找一種方法來批量添加密鑰到目錄中的所有 JSON 檔案,最好使用命令列工具。
檔案:
/config$ ls
166bbdd41c0297755ddb645db2b4c865 46a5c83d30483acba49a542a1ade9c33 87b2a640a5398156bf2d924b130ce42c ca5b4cbc16a580cf5236097ec39e90e9
JSON結構為:
{
"enabled": true,
"services": [
"933579ee8caafc4e818ddfe02ab58fdc"
],
"tags": [
"2a521880b86a0f043eb65cff37fac679",
"b4fd044b9a7ab1146bb638ea42219b99"
],
"bouquet": ""
}
問題是,如果檔案在“tags”陣列中包含“b4fd044b9a7ab1146bb638ea42219b99”值,那么將新元素添加到陣列“services”的最佳方法是什么。如果“tags”陣列中不存在此值,則跳過該檔案,否則將“NEWVALUETOADD”添加到“services”。
如果“NEWVALUETOADD”已經存在,我們也可以跳過該檔案。
示例輸出:
{
"enabled": true,
"services": [
"NEWVALUETOADD"
"933579ee8caafc4e818ddfe02ab58fdc"
],
"tags": [
"2a521880b86a0f043eb65cff37fac679",
"b4fd044b9a7ab1146bb638ea42219b99"
],
"bouquet": ""
}
uj5u.com熱心網友回復:
一個簡單的if … then … else … end可能會:
jq --arg q "b4fd044b9a7ab1146bb638ea42219b99" --arg n "NEWVALUETOADD" '
if IN(.tags[]; $q) and (IN(.services[]; $n) | not)
then .services = [$n] else . end
'
{
"enabled": true,
"services": [
"933579ee8caafc4e818ddfe02ab58fdc",
"NEWVALUETOADD"
],
"tags": [
"2a521880b86a0f043eb65cff37fac679",
"b4fd044b9a7ab1146bb638ea42219b99"
],
"bouquet": ""
}
演示
為了然后迭代每個檔案并修改它,您需要使用臨時檔案,因為 jq 沒有就地編輯選項(與sed一樣sed -i)。
for file in *
do jq --arg q "b4fd044b9a7ab1146bb638ea42219b99" --arg n "NEWVALUETOADD" '
if IN(.tags[]; $q) and (IN(.services[]; $n) | not)
then .services = [$n] else . end
' "$file" > "$file.new" && mv "$file.new" "$file"
done
uj5u.com熱心網友回復:
這條路:
jq --arg nv "NEWVALUETOADD" 'select(.tags[] | select(. == "b4fd044b9a7ab1146bb638ea42219b99") ).services = [$nv]'
jq 腳本:
select(
.tags[] | select(
. == "b4fd044b9a7ab1146bb638ea42219b99"
)
).services = [$nv]
jqplay.org 上面有這個
uj5u.com熱心網友回復:
一種選擇是使用索引來找到與所需值的完全匹配,然后添加新元素,例如
jq '(select(.tags | index("b4fd044b9a7ab1146bb638ea42219b99")).services ) =["New Value"]' yourfile
Demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416873.html
標籤:
