yaml 필드를 파일 콘텐츠로 바꾸기

yaml 필드를 파일 콘텐츠로 바꾸기

최근에 이와 매우 유사한 질문을 했지만 해당 특정 사례에 대한 솔루션에 대한 충분한 피드백을 제공하지 못했습니다. 더 많은 정보와 배경이 담긴 질문을 열어보세요.

두 개의 파일이 있습니다.

파일 1:

not_keyword: 'something'
keyword: 'condition'
another_not_keyword: 'something'

파일 2:

condition 1 condition 2 condition 3

다음 항목을 모두 찾고 싶습니다 keyword.파일 1그리고 그 내용을 교체하세요(건강 상태)내용이 있는파일 2.

이 경우 원하는 출력은 다음과 같습니다.

not_keyword: 'something'
keyword: 'condition 1 condition 2 condition 3'
another_not_keyword: 'something"

내 의도는 적절한 위치(파일 자체에서 직접)에서 교체가 발생하도록 하는 것입니다. gawk를 사용한 솔루션이 제공되었지만 안타깝게도 sed 또는 awk 외에는 사용할 수 없습니다.

답변1

Awk방법:

awk '$1=="keyword:"{ getline k < "file2"; print $1, "\047" k "\047"; next }1' file1

산출:

not_keyword: 'something'
keyword: 'condition 1 condition 2 condition 3'
another_not_keyword: 'something'

대안으로 sed내부 대체를 사용하십시오.

$ sed -Ei "s/^(keyword: ).*/\1'$(cat file2)'/" file1

답변2

$ cat tst.awk
NR == FNR {
    new = (NR>1 ? new ORS : "") $0
    next
}
$1 == "keyword:" {
    $0 = $1 OFS "\047" new "\047"
}
{ print }

$ awk -f tst.awk file2 file1
not_keyword: 'something'
keyword: 'condition 1 condition 2 condition 3'
another_not_keyword: 'something'

답변3

이 문제는 YAML을 지원하지 않는 도구를 사용하는 솔루션이 필요합니다. 해결책을 제시하고 있어요yq안드레이 키슬류크(Mike Farah가 아님 yq) YAML을 지원합니다.

yq -Y '.keyword = input' file newdata

질문의 데이터 출력을 제공합니다.

not_keyword: 'something'
keyword: 'condition 1 condition 2 condition 3'
another_not_keyword: 'something'

내부 편집을 사용 -i하거나 수행할 수 있습니다.--in-place

관련 정보