내 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