私が望む行は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文書があなたが持っているものであり、2番目のJSON文書はあなたが得たいことを示していると仮定します。
使用jq
:
jq '.[] |= ( to_entries | [.[0],.[2],.[1]] | from_entries )' file
最初のビットはto_entries
2つのサブオブジェクトの合計foo
にそれぞれ適用され、それbar
を「アイテム」、つまりキーを持つ配列に変換します。たとえば、オブジェクトは次のようになります。key
value
foo
[
{
"key": "prefix",
"value": "foo"
},
{
"key": "description",
"value": "foo"
},
{
"key": "body",
"value": [
"line 1",
" line 2"
]
}
]
ここでは、配列の3つの要素を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"
}
}
各子オブジェクトのキー命名に満足している場合(最後の2つのキーを置き換える代わりに)、次のコマンドは上記と同じ効果を持ちます。
jq '.[] |= { prefix: .prefix, body: .body, description: .description }' file
これは基本的に新しい2つの子オブジェクトfoo
のそれぞれのオブジェクトでbar
あり、そのキーは指定された順序でソートされます。
答え2
使用sed
sed '/description/d; s/.prefix.:\s\(.[a-z]*.\)./&\n\t"description": \1/' $file
このソリューションは、その文字列を含むすべての行を削除しますdescription
。
その後、一致するすべての行を一致させ、prefix
再度独自に置き換えてから、&
新しい行に移動します。
description
次に、前の一致のORを手動で挿入し、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",
"...."
],
}
}