최근에 이와 매우 유사한 질문을 했지만 해당 특정 사례에 대한 솔루션에 대한 충분한 피드백을 제공하지 못했습니다. 더 많은 정보와 배경이 담긴 질문을 열어보세요.
두 개의 파일이 있습니다.
파일 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