如何使用 shell 编辑 JSON 文件?

如何使用 shell 编辑 JSON 文件?

我正在构建一个使用 JSON 文件的 shell 脚本。

{
  "property1": true,
  "list": [
    {
      "id": 1,
      "name": "APP1"
    },
    {
      "id": 2,
      "name": "APP2"
    }
  ],
  "property2": false
}

name我需要使用 shell 脚本从 中读取list并从列表中删除其父对象。基本上我需要APP1从using shell 中删除具有名称的对象list。编辑 JSON 结构不是一个选项。

答案1

使用 del 函数杰克:

jq 'del(.list[] | select(.name=="APP1"))'

如果您想将应用程序名称作为 shell 变量传递给 jq,您可以使用--arg选项:

jq --arg name "$name" 'del(.list[] | select(.name==$name))'

答案2

我会使用 Python 编写脚本,它内置了 JSON 读/写函数。

给定一个文件 ,myfile.json其中包含 OP 中的 JSON 对象:

#!/usr/bin/env python  # Use the Python interpreter
from json import load, dump  # Import the JSON file read and write functions
with open("myfile.json", "r") as file_object:  # Open the JSON file for reading
    json_data = load(file_object)  # Load the data into a dictionary

new_list = [item for item in json_data["list"] if item["name"] != "APP1"]  # Make a new list without the item that should be removed
json_data["list"] = new_list  # Update the dictionary with the new list

with open("myfile.json", "w") as file_object:  # Open the JSON file for writing and truncate it
    dump(json_data, file_object)  # Write the file back to disk

答案3

您可以通过以下方式做到这一点zq

zq -f json '{...this, list: (over list | name != "APP1")}' input.json

zq 是一个用于整理数据的命令行工具。它使用泽德语言操纵价值流。

答案4

正如詹姆斯·科尔所示 以及亚伦·F,但使用jq而不是zq或Python。该操作将.list数组设置为原始数组中不等于.name的元素APP1

$ jq '.list |= map(select(.name != "APP1"))' file
{
  "property1": true,
  "list": [
    {
      "id": 2,
      "name": "APP2"
    }
  ],
  "property2": false
}

相关内容