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
익숙하지 않아JSON하지만 내 생각에는 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은 유지하면서).