2016-11-26 44 views
0

我想寫一個批處理腳本來改變名爲example1.json和example2.json的2個jsons的「tags」鍵的值。需要用新值替換json中的tags字段

輸入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": [ 
       "*/*" 
      ] 
     } 
    } 
    } 
} 

輸入example2.json

{ 
"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": [ 
       "*/*" 
      ] 
     } 
    } 
    } 
} 

預期輸出是二jsons同名但現在的標籤值被改變。

Example1.json:

輸入標籤值 - 例1(這是JSON文件名)

輸出變量值 - 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": [ 
       "*/*" 
      ] 
     } 
    } 
    } 
} 

輸出繼電器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 

由於SED不工作對於多行,我將換行符更改爲#removenewlines#並將所有內容移至單行(第1行和第2行)。在第3行中,我嘗試使用通配符\(.*\)和變量%oldtagvalue%來查找關鍵標記,然後用%newtagvalue%替換它。在第4行中,我正在格式化json。 上面的代碼中循環運行,所以對於變量第一環路值將是

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

對於第二個循環值將是

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

但它不工作。請指教。我也嘗試使用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