Mike Farah의 yq를 사용하여 yaml 파일에 콘텐츠 추가

Mike Farah의 yq를 사용하여 yaml 파일에 콘텐츠 추가

이것은 기본적인 질문이지만 bash 경험이 없기 때문에 이 작업을 수행하는 데 어려움을 겪고 있습니다.

나에게 Directory_1 디렉터리가 있고 이 디렉터리에 cen1.yaml 및 cen2.yaml이 있다고 가정합니다. cen1.yaml에는 name이라는 필드가 있습니다.

name:xxxx

cen2.yaml의 내용은 다를 수 있습니다(예).

service:ser1
image:
  field1:field1
  field2:field2
.
.
.

첫 번째 반복에는 빈 Final.yaml이 있습니다. 하지만 저는 이 파일이 cen1.yaml의 이름을 갖고 cen2의 모든 항목이 그러한 이름을 갖기를 원합니다.

xxxx:
  service:ser1
  image:
    field1:field1
    field2:field2
  .
  .
  .

다음으로, 동일한 파일 이름(cen1.yaml 및 cen2.yaml)을 가진 다른 디렉터리를 복제하겠습니다. Cen1.yaml에는 다시 이름 필드가 있습니다.

name:another

그리고 cen2.yaml에는 자체 콘텐츠가 있습니다.

tv:lcd
name:
  field1:field1
  field2:field2
.
.
.

이제 기존 파일에 추가하고 동일한 구조를 유지해야 합니다.

xxxx:
  service:ser1
  image:
    field1:field1
    field2:field2
  .
  .
  .
another
  tv:lcd
  mount:
    field1:field1
    field2:field2
  .
  .
  .

따라서 두 가지 경우에 작동하는 명령이 필요합니다. 파일이 비어 있고 첫 번째 반복을 작성하는 경우 또는 파일에 이미 내용이 있고 내용이 추가되는 경우입니다. 이 목표를 어떻게 달성할 수 있나요?

답변1

yq다음은 이름을 로드하여 내부 변수 cen1.yaml에 넣는 Mike Farah의 표현입니다 . 그런 다음 아래 제공된 키를 사용하여 새 YAML 문서를 생성하고 해당 문서에 로드합니다 .yq$namecen2.yaml$name

load("cen1.yaml").name as $name | .[$name] = load("cen2.yaml")

이를 사용하여 여러 하위 디렉터리를 반복하고, yq각 하위 디렉터리에 적용하고, 거기에서 출력을 수집할 수 있습니다 final.yaml. 이 코드는 디렉터리가 모두 파일 이름 와일드카드 패턴과 일치한다고 가정합니다 directory_*.

for dir in directory_*; do
(
    cd "$dir" &&
    yq -n 'load("cen1.yaml").name as $name | .[$name] = load("cen2.yaml")'
)
done >final.yaml

명령줄에 제공된 파일을 사용하지 않기 때문에 -nwith를 사용합니다 .yq

질문의 데이터를 고려하면(점선을 제거하고 각 뒤에 공백을 삽입하여 수정됨 :) 다음과 같은 YAML 파일이 생성됩니다.

xxxx:
  service: ser1
  image:
    field1: field1
    field2: field2
another:
  tv: lcd
  name:
    field1: field1
    field2: field2

모든 디렉터리를 동시에 사용할 수 없는 경우 final.yaml비트를 추가하여 파일을 빌드할 수 있습니다.

rm -f final.yaml

# Get directory_1, and then...
(
    cd directory_1 &&
    yq -n 'load("cen1.yaml").name as $name | .[$name] = load("cen2.yaml")'
) >>final.yaml

# Get directory_2, and then...
(
    cd directory_2 &&
    yq -n 'load("cen1.yaml").name as $name | .[$name] = load("cen2.yaml")'
) >>final.yaml

# etc.

...기본적으로 루프의 각 반복을 수동으로 실행하고 각 단계의 결과 파일에 출력을 추가합니다.


같은 일이지만 Andrey Kislyuk의 yq(래퍼 jq)를 사용합니다.

for dir in directory_*; do
(
    cd "$dir" &&
    yq -n -y 'input.name as $name | .[$name] = inputs' cen1.yaml cen2.yaml
)
done >final.yaml

관련 정보