我希望 的行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
,并将它们转换为“条目”,即带有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
,其键按指定顺序排列。
答案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",
"...."
],
}
}