내가 원하는 줄은 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
그런 다음 이전 일치 항목의 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",
"...."
],
}
}