여러 줄 삭제

여러 줄 삭제

json 파일 목록에서 특정 코드 섹션/줄을 삭제하는 명령줄 인터페이스를 작성하려고 합니다. 그런데 json 파일은 홈 디렉터리의 하위 폴더에 있습니다.

나는 이것에 대해 매우 새로운 것이지만 이것은 지금까지 생각해 낼 수 있는 코드입니다. find -name "*.json" | xargs sed -i "map"그러나 내가 가지고 있는 json 파일 중 일부는 약간 다른 형식입니다.

지금까지 목록에는 다음 2가지 형식이 표시됩니다.

{
    "tags": {}, 
    "map": {
        "KPA": {
            "State": True, 
            "namespace": "KPA01"
        }
    }
}

또는

{
    "tags": {
        "type": [
            "char"
        ], 
        "dynamic": true
    }, 
    "map": {
        "KPA01": {
           "State": True, 
            "namespace": "KPA01"
        }
    }
}

기본적으로 지도 부분을 생략하여 레이블 부분만 표시하려고 하는데 []쉼표 및 /가 있어서 {}어렵습니다. 따라서 내 출력은 다음과 같아야 합니다.

{
    "tags": {}
}

또는

{
    "tags": {
        "type": [
            "char"
        ], 
        "dynamic": true
    }
}

명령줄 인터페이스에서 이 작업을 수행할 수 있습니까? jq가 이 작업을 수행할 수 있다고 들었는데, 이를 실행하려고 하면 터미널 jq '.map' test.json에 갇히게 됩니다 . parse error: ':' not as part of an object at line 2, column 11마찬가지로, 내가 사용하는 경우에도 오류가 발생하는 것 같습니다.JQ 플레이온라인..

어떤 아이디어가 있나요?

답변1

먼저 True다음과 같이 변경합니다 true. 전반적으로 이것은 꽤 잘 작동합니다.

#!/usr/bin/python
import sys
import json

inputfile = sys.argv[1]
with open(inputfile,'r') as myfile:
    obj = json.loads(myfile.read().replace('True','true'))
    if "map" in obj:
        del obj["map"]
    json.dump(obj,sys.stdout,indent=4,separators=(',',': '))

이는 표준 출력에 기록됩니다.

편집: 이전 내부 버전은 약간 위험한 것 같습니다. 이렇게 하는 것이 더 좋습니다:

#!/usr/bin/python
import sys
import json

inputfile = sys.argv[1]
with open(inputfile,'r') as myfile:
    obj = json.loads(myfile.read().replace('True','true'))
    if "map" in obj:
        del obj["map"]
with open(inputfile,'w') as myfile:
    json.dump(obj,myfile,indent=4,separators=(',',': '))

스크립트는 실제로 유효한 JSON이 무엇인지 알고 있기 때문에 예측할 수 없는 출력을 생성하는 대신 잘못된 코드가 발견되면 예외를 발생시킵니다.

이것은 Python 3에서 작동합니다.

편집 2:

원하는 방식으로 개체를 수정할 수 있습니다. Json의 목적은 개체를 직렬화하는 것입니다. 이를 연관 배열로 취급하고 원하는 값을 지정하십시오. 예를 들어 다음과 같이 할 수 있습니다.

#add a new string on the "ground" level
obj["new_key"]="lol"
#add a new subarray, with properties of different types
obj["this_is_array"]={"a": 3, "b": 16, "c": "string", "d": False }
#modify the value of existing field
obj["new_key"]="new value"
#insert into subarray (test if it exists first)
if "this_is_array" in obj:
    obj["this_is_array"]["e"]=42

답변2

처리하면진짜>진짜다른 곳에서 언급하고 jq도구를 가져오면 다음을 수행할 수 있습니다.

jq '{tags}' <infile

예를 들어, 예제 중 하나를 내 클립보드에 복사한 후:

xsel -bo | sed 's/True/true/g' | jq '{tags}'

산출:

{
  "tags": {
    "type": [
      "char"
    ],
    "dynamic": true
  }
}

답변3

동일한 오류를 발견했습니다.

parse error: Invalid numeric literal at line 5, column 26

익숙하지 않아하지만 내 생각에는 True소문자로 입력해야 true실행될 수 있습니다.한 줄로 수정한 후 이를 사용하여 다음과 같은 키를 jq필터링합니다 .map

perl -pe 's/(\W)T(rue)/$1t$2/g' file1.json | ./jq 'del(.map)'

첫 번째 예의 경우 결과는 다음과 같습니다.

{
  "tags": {}
}

그리고:

perl -pe 's/(\W)T(rue)/$1t$2/g' file2.json | ./jq 'del(.map)'

두 번째 결과는 다음과 같습니다.

{
  "tags": {
    "type": [
      "char"
    ],
    "dynamic": true
  }
}

답변4

질문은 오래되었지만 옵션의 완성도를 위해 여기에 있습니다.유나이티드 TC다음을 기반으로 한 솔루션:

bash $ jtc -pw'<map>l+0' input.json
{
   "tags": {
      "dynamic": true,
      "type": [
         "char"
      ]
   }
}
bash $ 
  • 모든 태그를 찾아서 "map"지웁니다(나머지 json은 유지하면서).

관련 정보