json 파일의 줄 위치 순서 변경

json 파일의 줄 위치 순서 변경

내가 원하는 줄은 description그 줄 뒤에 있어요body

예.

에서:

{
    "foo": {
        "prefix": "foo",
        "description": "foo",
        "body": [
            "line 1",
            "  line 2"
        ]
    },
    "bar": {
        "prefix": "bar1",
        "description": "bar 1 bar",
        "body": [
            "line 1",
            "  line 2",
            "  line 3",
            "...."
        ]
    }
}

도착하다:

{
    "foo": {
        "prefix": "foo",
        "body": [
            "line 1",
            "  line 2"
        ],
        "description": "foo"
    },
    "bar": {
        "prefix": "bar1",
        "body": [
            "line 1",
            "  line 2",
            "  line 3",
            "...."
        ],
        "description": "bar 1 bar"
    }
}

답변1

나는 당신이 가지고 있는 첫 번째 JSON 문서가 당신이 가지고 있는 것이고, 두 번째 JSON 문서는 당신이 얻고자 하는 것을 보여준다고 가정할 것입니다.

사용 jq:

jq '.[] |= ( to_entries | [.[0],.[2],.[1]] | from_entries )' file

첫 번째 비트는 to_entries두 개의 하위 객체 합계 foo각각 에 적용되어 bar이를 "항목", 즉 keyvalue키가 있는 배열로 변환합니다. 예를 들어, foo객체는 다음과 같습니다.

[
  {
    "key": "prefix",
    "value": "foo"
  },
  {
    "key": "description",
    "value": "foo"
  },
  {
    "key": "body",
    "value": [
      "line 1",
      "  line 2"
    ]
  }
]

여기서는 배열의 세 요소를 0, 1, 2 순서에서 0, 2, 1 순서로 재배열하기만 하면 됩니다. 즉, 마지막 요소를 항목으로 교체하면 됩니다.

이것이 우리가 하는 일입니다 [.[0],.[2],.[1]].

그런 다음 from_entries.

데이터 반환에서 이것을 테스트하십시오.

{
  "foo": {
    "prefix": "foo",
    "body": [
      "line 1",
      "  line 2"
    ],
    "description": "foo"
  },
  "bar": {
    "prefix": "bar1",
    "body": [
      "line 1",
      "  line 2",
      "  line 3",
      "...."
    ],
    "description": "bar 1 bar"
  }
}

각 하위 개체의 키 이름 지정에 만족하는 경우(마지막 두 키를 바꾸는 대신) 다음 명령은 위와 동일한 효과를 갖습니다.

jq '.[] |= { prefix: .prefix, body: .body, description: .description }' file

이것은 기본적으로새로운두 개의 하위 개체 foo각각에 대한 개체 bar이며 해당 키는 지정된 순서로 정렬됩니다.

답변2

사용sed

sed '/description/d; s/.prefix.:\s\(.[a-z]*.\)./&\n\t"description": \1/' $file

이 솔루션은 해당 문자열을 포함하는 모든 줄을 삭제합니다 description.

그 후에는 일치하는 모든 줄을 일치시키고 prefix다시 자체적으로 교체한 &다음 새 줄로 이동합니다.

description그런 다음 이전 일치 항목의 OR를 수동으로 삽입 foo하고 bar백슬래시 로 다시 그룹화합니다.()\1

{
    "foo": {
        "prefix": "foo",
        "description": "foo"
        "body": [
            "line 1",
            "  line 2",
        ],
    },
    "bar": {
        "prefix": "bar",
        "description": "bar"
        "body": [
            "line 1",
            "  line 2",
            "  line 3",
            "...."
        ],
    }
}

관련 정보