Sed

更改json文件中行位置的順序

  • August 6, 2021

我希望行在行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應用於兩個子對像中的每一個foobar,並將它們變成“條目”,即帶有keyvalue鍵的數組。例如,對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

引用自:https://unix.stackexchange.com/questions/663338