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

更改 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"
    }
}

答案1

我将假设您拥有的第一个 JSON 文档是您所拥有的,而您的第二个 JSON 文档显示的是您想要获得的内容。

使用jq

jq '.[] |= ( to_entries | [.[0],.[2],.[1]] | from_entries )' file

第一位 ,to_entries应用于两个子对象foo和中的每一个bar,并将它们转换为“条目”,即带有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,其键按指定顺序排列。

答案2

使用sed

sed '/description/d; s/.prefix.:\s\(.[a-z]*.\)./&\n\t"description": \1/' $file

此解决方案将删除包含该字符串的所有行description

之后,它将匹配所有匹配的行prefix,并将其替换回自身,&然后移动到新行。

description然后手动插入前一个匹配项中的foo或并用反斜杠重新bar分组()\1

{
    "foo": {
        "prefix": "foo",
        "description": "foo"
        "body": [
            "line 1",
            "  line 2",
        ],
    },
    "bar": {
        "prefix": "bar",
        "description": "bar"
        "body": [
            "line 1",
            "  line 2",
            "  line 3",
            "...."
        ],
    }
}

相关内容