셸을 사용하여 YAML 부분 구문 분석

셸을 사용하여 YAML 부분 구문 분석

내 YAML은 다음과 같습니다

something:
 - whatever:
   - something
 - toc: 4
 - body: assets/footer.html
pkg:
 - pkg_a_1:
   - Shass
   - AJh55
   - ASH7
 - pkg_b_1:
   - Kjs6
   - opsaa
other:
morestuff:
 - whatever

다음 내용을 추출하고 싶습니다.패키지다음과 같이 텍스트 파일로 인쇄합니다.

pkg_a_1 Shass
pkg_a_1 AJh55
pkg_a_1 ASH7
pkg_b_1 Kjs6
pkg_b_1 opsaa

이 섹션만 필요하고 나머지 대형 YAML 파일은 필요하지 않기 때문에 전체 YAML 파서를 사용하지 않으려고 합니다.

  • 일부 태그(패키지)은 고정되어 한 번만 나타나며 변경되지 않습니다.
  • 측정값 레이블 및 측정값 번호(pkg_a_1,pkg_b_1)을 교체할 수 있습니다.
  • 각 섹션의 항목 수와 순서는 변경될 수 있습니다. 프로젝트에는 [A-Za-z0-9]+.
  • 내용 전과 후패키지부품은 변경될 수 있습니다. IE의 다양한 부분무엇:그리고 다른:존재할 수도 있고 존재하지 않을 수도 있습니다.

답변1

$ awk '/^[^ ]/{ f=/^pkg:/; next } f{ if (sub(/:$/,"")) pkg=$2; else print pkg, $2 }' file
pkg_a_1 Shass
pkg_a_1 AJh55
pkg_a_1 ASH7
pkg_b_1 Kjs6
pkg_b_1 opsaa

답변2

yq다음에서 사용https://kislyuk.github.io/yq/

yq -r '.pkg[] | to_entries[] | .key as $key | .value[] | [ $key, . ] | @tsv' file.yaml

yq이는 YAML 데이터를 표현식을 사용하여 jq처리 할 수 있는 JSON 문서로 변환합니다 .

이 표현식은 다음과 같이 항목을 pkg객체 세트로 변환합니다.

{
  "key": "pkg_a_1",
  "value": [
    "Shass",
    "AJh55",
    "ASH7"
  ]
}
{
  "key": "pkg_b_1",
  "value": [
    "Kjs6",
    "opsaa"
  ]
}

이러한 각 객체의 배열은 value반복되고 key현재 배열은 value연산자를 사용하여 탭으로 구분된 목록으로 변환됩니다 @tsv.

질문의 데이터를 고려하면 최종 출력은 탭으로 구분된 목록입니다.

pkg_a_1 Shass
pkg_a_1 AJh55
pkg_a_1 ASH7
pkg_b_1 Kjs6
pkg_b_1 opsaa

답변3

Mike Farrar의 제품을 선택할 수도 있습니다.yq, 그리고 jq:

yq -j r infile.yml 'pkg.*' |
jq -r 'to_entries[] | .key as $k | .value | map(. = $k + " " + .) | join("\n")'

산출:

pkg_a_1 Shass
pkg_a_1 AJh55
pkg_a_1 ASH7
pkg_b_1 Kjs6
pkg_b_1 opsaa

관련 정보