Sed
更改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" } }
我將假設您的第一個 JSON 文件就是您所擁有的,並且您的第二個 JSON 文件顯示了您想要獲得的內容。
使用
jq
:jq '.[] |= ( to_entries | [.[0],.[2],.[1]] | from_entries )' file
第一個位 ,
to_entries
應用於兩個子對像中的每一個foo
和bar
,並將它們變成“條目”,即帶有key
和value
鍵的數組。例如,對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