1. 程式人生 > 實用技巧 >jq基本用法:修改訪問

jq基本用法:修改訪問

jq的基本用法:修改訪問

以輸入t.json為例:

{
  "F1": 9,
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "F522"
    }
  ]
}

修改欄位

$ jq '.F1=100' t.json  
{
  "F1": 100,
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "F522"
    }
  ]
}

$ jq '.F5[1].F52="new value"' t.json                  
{
  "F1": 9,
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "new value"
    }
  ]
}

增加欄位

$ jq '.F3="new value"' t.json        
{
  "F1": 9,
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "F522"
    }
  ],
  "F3": "new value"
}

$ jq '.F5[1].F53="new value"' t.json 
{
  "F1": 9,
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "F522",
      "F53": "new value"
    }
  ]
}

增加陣列和map

$ jq '.F5[2]={"F51": 513, "F52": "F523"}' t.json      
{
  "F1": 9,
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "F522"
    },
    {
      "F51": 513,
      "F52": "F523"
    }
  ]
}

如果陣列是簡單型別:

$ jq . t.json
{
  "F3": [
    "F31",
    "F32"
  ]
}
$ jq '.F3[2]="F33"' t.json
{
  "F3": [
    "F31",
    "F32",
    "F33"
  ]
}

增加陣列元素

利用length函式得到陣列的長度,然後把值設定到當前位置。

$ jq '.F3[.F3|length]="NEWValue"' t.json

刪除

使用del函式刪除元素,包括基本元素,物件和陣列元素。

$ jq 'del(.F1)' t.json 
{
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "F522"
    }
  ]
}

$ jq 'del(.F5[1].F52)' t.json    
{
  "F1": 9,
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512
    }
  ]
}

刪除一個數組成員:

$ jq 'del(.F5[1])' t.json    
{
  "F1": 9,
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    }
  ]
}

刪除陣列成員

$ cat t.json
{
  "F": [
    "F0",
    "F1",
    "F2",
    "F3",
    "F4",
    "F5"
  ]
}
$ jq 'del(.F)' t.json  # delete field F
{}
$ jq 'del(.F[])' t.json  # delete members of field F
{
  "F": []
}
$ jq 'del(.F[0])' t.json  # delete member of fields F[0]
{
  "F": [
    "F1",
    "F2",
    "F3",
    "F4",
    "F5"
  ]
}
$ jq 'del(.F[0,2,4])' t.json  # delete member of fields F[0], F[2], and F[4]
{
  "F": [
    "F1",
    "F3",
    "F5"
  ]
}

執行多次修改

使用("|")連線多個命令。
連線符("|")功能類似shell裡面的("|"),把前面命令的輸出作為後面命令的輸入。

$ jq 'del(.F1) | del(.F5[1])' t.json              
{
  "F2": "F21",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    }
  ]
}

修改多個欄位:

$ jq '.F1="New F1" | .F2="New F2"' t.json
{
  "F1": "New F1",
  "F2": "New F2",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "F522"
    }
  ]
}

或者:

$ jq '. +{F1: "New Fa", F2: "New F2"}' t.json
{
  "F1": "New Fa",
  "F2": "New F2",
  "F5": [
    {
      "F51": 511,
      "F52": "F521"
    },
    {
      "F51": 512,
      "F52": "F522"
    }
  ]
}
0人點贊 Linux常用工具之 - jq

作者:CodingCode
連結:https://www.jianshu.com/p/2ea233708b1d
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。