2016-11-26 3 views
0

example1.json 및 example2.json이라는 2 개의 jons 아래에 대해 "tags"키의 값을 변경하는 배치 스크립트를 작성하려고합니다.json의 태그 필드를 새 값으로 바꾸어야 함

입력 example1.json

{ 
    "info": { 
    "title": "My example swagger 1", 
    "version": "1.0" 
    }, 
    "paths": { 
    "/v1/resource1": { 
     "get": { 
      "description": "This is the example1", 
      "tags": [ 
       "example1" 
      ], 
      "consumes": [ 
       "*/*" 
      ] 
     } 
    }, 
    "/v1/resource2": { 
     "get": { 
      "tags": [ 
       "example1" 
      ], 
      "consumes": [ 
       "*/*" 
      ] 
     } 
    } 
    } 
} 

입력 예상 출력이 동일한 이름을 가진 두 jsons하지만 태그 값이 현재 변경

{ 
"info": { 
    "title": "My example swagger 2", 
    "version": "1.0" 
    }, 
    "paths": { 
    "/v1/resource3": { 
     "get": { 
      "description": "This is the example2", 
      "tags": [ 
       "example2" 
      ], 
      "consumes": [ 
       "*/*" 
      ] 
     } 
    }, 
    "/v1/resource4": { 
     "get": { 
      "tags": [ 
       "example2" 
      ], 
      "consumes": [ 
       "*/*" 
      ] 
     } 
    } 
    } 
} 

example2.json.

Example1.json :

입력 태그 값 - JSON (파일 이름이다) 예 1

출력 태그 값 - (필요에 따라) tags1

Example2.json

입력 태그 값 - example2 (json 파일 이름)

출력 태그 value - tags2 (요구 사항에 따라)

출력 Example1.json

{ 
    "info": { 
    "title": "My example swagger 1", 
    "version": "1.0" 
    }, 
    "paths": { 
    "/v1/resource1": { 
     "get": { 
      "description": "This is the example1", 
      "tags": [ 
       "tag1" 
      ], 
      "consumes": [ 
       "*/*" 
      ] 
     } 
    }, 
    "/v1/resource2": { 
     "get": { 
      "tags": [ 
       "tag1" 
      ], 
      "consumes": [ 
       "*/*" 
      ] 
     } 
    } 
    } 
} 

OUPUT Example2.json

{ 
    "info": { 
    "title": "My example swagger 2", 
    "version": "1.0" 
    }, 
    "paths": { 
    "/v1/resource3": { 
     "get": { 
      "description": "This is the example2", 
      "tags": [ 
       "tag2" 
      ], 
      "consumes": [ 
       "*/*" 
      ] 
     } 
    }, 
    "/v1/resource4": { 
     "get": { 
      "tags": [ 
       "tag2" 
      ], 
      "consumes": [ 
       "*/*" 
      ] 
     } 
    } 
    } 
} 

나는 배치 스크립트의 명령 아래에 쓴하지만 나오지도 작동하지 않기 때문에 그것은

sed -i "s/$/ #removenewlines#/" %1 
sed -i ":a;N;$!ba;s/\n//g" %1 
sed -i "s/\"tags\":\(.*\) \"%oldtagvalue%\"/\"tags\":\1 \"%newtagvalue%\"/g" %1 
sed -i "s/ #removenewlines#/\n/g" %1 

작동하지 않습니다 여러 라인의 경우 줄 바꿈을 # removenewlines #로 변경하고 모든 것을 한 줄로 옮겼습니다 (줄 1과 줄 2). 3 행에서 와일드 카드 \(.*\)과 변수 %oldtagvalue%을 사용하여 키 태그를 찾은 다음 %newtagvalue%으로 대체하려고합니다. 4 번 줄에서 json을 다시 포맷합니다. 변수들의 제 1 루프 값

$ echo %1 
$ example2.json 
$ echo %oldtagvalue% 
$ example2 
$ echo %newtagvalue% 
$ tag2 

될 것이다 2 루프 값의

$ echo %1 
$ example1.json 
$ echo %oldtagvalue% 
$ example1 
$ echo %newtagvalue% 
$ tag1 

될 것이기 때문에 위의 코드는 루프에서 실행하지만 작동되지 않는다. 제발 조언. 또한 jq 명령을 사용하여이를 수행하려고 시도했지만 잘 작동하지 않았습니다.

+0

"JSON"이 (가) 유효하지 않습니다. 우리가 그 텍스트 얼룩의 실제 의도 된 구조를 알아내는 것은 불가능합니다. 고쳐주세요. –

+0

@ApG - 질문은 명확하지 않습니다. 각 태그 값 (파일 내)을 변경하는 방법을 지정하고 예상 출력의 예를 제공하십시오. – peak

+0

@JeffMercado .. 나는 json을 정정했다. 제발 조언을 – ApG

답변

0

이것은 당신이 시작할 수 있어야합니다

$ jq --arg tag "tag1" ' 
    .paths |= with_entries(.value.get.tags[] = $tag)' Example1.json 

또는 약간 다른 압정에

, 당신은이 필터를 사용할 수 있습니다 아래와 같이 두 가지 경우 모두

# Apply f to composite entities recursively, and to atoms 
def walk(f): 
    . as $in 
    | if type == "object" then 
     reduce keys[] as $key 
     ({}; . + { ($key): ($in[$key] | walk(f)) }) | f 
    elif type == "array" then map(walk(f)) | f 
    else f 
    end; 
walk(if type=="object" and has("tags") then .tags[] |= $tag else . end) 

가 출력 될 것입니다. 물론 원한다면 jq 프로그램 내에서 프로그래밍 방식으로 "exampleN"을 "tagN"으로 프로그래밍 방식으로 변경할 수도 있습니다 (예 : sub/2 사용). 중요한 점은 jq만으로도 작업을 수행 할 수 있다는 것입니다.

{ 
    "info": { 
    "title": "My example swagger 1", 
    "version": "1.0" 
    }, 
    "paths": { 
    "/v1/resource1": { 
     "get": { 
     "description": "This is the example1", 
     "tags": [ 
      "tag1" 
     ], 
     "consumes": [ 
      "*/*" 
     ] 
     } 
    }, 
    "/v1/resource2": { 
     "get": { 
     "tags": [ 
      "tag1" 
     ], 
     "consumes": [ 
      "*/*" 
     ] 
     } 
    } 
    } 
} 
1

그래서 올바르게 이해하면 파일 이름이있는 태그를 바꾸고 원하는 태그로 바꾸고 싶습니다. 여기 하나의 방법 당신은 그것을 할 수 :

$ jq --arg newtag 'tag1' '(input_filename | sub("\\.json$"; "")) as $oldtag 
    | .paths[][].tags |= map(if . == $oldtag then $newtag else . end)' example1.json 

파일 이름과 일치하는 단지 하나를 임의의 태그를 대체하고 싶어하지 않으면, 또 다른 매개 변수를 추가 : 당신이되고 싶다면

$ jq --arg oldtag 'example1' --arg newtag 'tag1' \ 
    '.paths[][].tags |= map(if . == $oldtag then $newtag else . end)' example1.json 

을 여러 개의 다른 태그를 대체 할 수 있다면 이전 태그를 새 태그에 매핑하는 객체를 생성하고이를 빌드 할 수 있습니다.

$ jq --argjson tagmap '{"example1":"tag1","example2":"tag2"}' \ 
    '.paths[][].tags |= map($tagmap[.] // .)' example1.json 
관련 문제