쉘을 사용하여 JSON 파일을 편집하는 방법은 무엇입니까?

쉘을 사용하여 JSON 파일을 편집하는 방법은 무엇입니까?

JSON 파일을 사용하는 쉘 스크립트를 작성 중입니다.

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

namelist이를 읽고 목록에서 상위 개체를 제거하려면 쉘 스크립트를 사용해야 합니다 . 기본적으로 APP1shell 을 사용하여 이름이 있는 개체를 삭제 해야 합니다 list. JSON 구조 편집은 옵션이 아닙니다.

답변1

del 함수 사용:

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

애플리케이션 이름을 쉘 변수로 jq에 전달하려면 다음을 사용할 수 있습니다.--arg옵션:

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

답변2

저는 JSON 읽기/쓰기 기능이 내장된 Python으로 스크립트를 작성할 것입니다.

myfile.jsonOP의 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., 대신 Python을 사용 jq합니다 zq. 이 작업은 .list원래 배열과 동일하지 않은 .name요소 로 배열을 설정합니다 APP1.

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

관련 정보