sed를 사용하여 파일에서 일치하는 항목을 찾아 다른 파일의 내용으로 교체

sed를 사용하여 파일에서 일치하는 항목을 찾아 다른 파일의 내용으로 교체

다음과 같은 콘텐츠 파일이 있습니다.

content.json(객체 배열)

[
{ "interval": 1, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 2, "expired": 4, "ignored": [ ".git", ".p4" ]},
]

내용은 비슷하지만 값이 다른 구성 파일이 있습니다.

config.json(객체값)

{ "interval": 3, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 4, "expired": 4, "ignored": [ ".git", ".p4" ]},

내 목표는 config.json 파일의 내용을 content.json 파일에 추가하여 새 content.json 파일이 다음과 같이 되도록 하는 것입니다.

[
{ "interval": 1, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 2, "expired": 4, "ignored": [ ".git", ".p4" ]},
{ "interval": 3, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 4, "expired": 4, "ignored": [ ".git", ".p4" ]},
]

},\n]내 생각은 content.json 파일에서 정규식을 찾아 config.json 파일의 내용으로 바꾸는 것입니다 . 저는 이러한 명령을 원격으로 실행하고 있으므로 sed를 사용하여 단일 명령으로 실행하는 것이 좋습니다. 그러나 어떻게 든 나는 이것을 달성하기 위해 sed에서 적절한 문서/도움을 얻지 못합니다.

누구든지 여기서 도와줄 수 있나요?

답변1

이러한 파일이 유효한 JSON 파일이라고 가정합니다. 즉, content.json파일은 다음과 같습니다.

[
{ "interval": 1, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 2, "expired": 4, "ignored": [ ".git", ".p4" ]}
]

또는 좋아한다

{ "interval": 1, "expired": 3, "ignored": [ ".git", ".p4" ]}
{ "interval": 2, "expired": 4, "ignored": [ ".git", ".p4" ]}

config.json처럼 보인다

[
{ "interval": 3, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 4, "expired": 4, "ignored": [ ".git", ".p4" ]}
]

또는 좋아한다

{ "interval": 3, "expired": 3, "ignored": [ ".git", ".p4" ]}
{ "interval": 4, "expired": 4, "ignored": [ ".git", ".p4" ]}

...이를 jq사용하면 두 배열을 필요한 JSON 구조로 쉽게 병합할 수 있습니다.

$ jq -s flatten content.json config.json
[
  {
    "interval": 1,
    "expired": 3,
    "ignored": [
      ".git",
      ".p4"
    ]
  },
  {
    "interval": 2,
    "expired": 4,
    "ignored": [
      ".git",
      ".p4"
    ]
  },
  {
    "interval": 3,
    "expired": 3,
    "ignored": [
      ".git",
      ".p4"
    ]
  },
  {
    "interval": 4,
    "expired": 4,
    "ignored": [
      ".git",
      ".p4"
    ]
  }
]

flatten의 명령은 jq배열의 최상위 항목을 병합합니다. 배열은 두 개의 개별 배열 항목으로 각 파일의 데이터로 구성된 배열입니다.

jq -c보다 컴팩트한 출력을 원하시면 :

$ jq -cs flatten content.json config.json
[{"interval":1,"expired":3,"ignored":[".git",".p4"]},{"interval":2,"expired":4,"ignored":[".git",".p4"]},{"interval":3,"expired":3,"ignored":[".git",".p4"]},{"interval":4,"expired":4,"ignored":[".git",".p4"]}]

답변2

이렇게 하는 것이 좋습니다 jq(다른 답변 참조).

그러나 실제로 sed를 사용해야 하고 구성 파일에 여는 대괄호와 닫는 대괄호가 없는 경우(표시된 대로) 다음을 수행하십시오(GNU 사용 sed).

sed -i -e '$rconfig.json' -e '$a]' -e '$d' content.json

관련 정보