이 sed 표현식은 작동하지만 검색 패턴을 표현하고 문자열의 공백을 바꾸는 더 좋은 방법이 있습니까?
BRANCHTAG=7.17.9-main-5ee3e99d5ff002862d93728d821461033de1186d
PRIOR_VERSION=7.17.4
clear; sed "s/^ newTag: ${PRIOR_VERSION}.*$/ newTag: ${BRANCHTAG}/" kustomization.yaml
newTag를 검색하면 파일의 모든 newTag 문자열이 대체되므로 검색할 수 없습니다.
답변1
줄 시작 부분에 공백(공백 또는 탭)을 얼마든지 허용하고 이를 보존하고 싶다고 가정해 보겠습니다.
sed "s/^\([[:blank:]]*newTag:\) $PRIOR_VERSION.*/\1 $BRANCHTAG/" kustomization.yaml
이는 역참조를 사용하여 일치하는 공백과 키 자체를 표현식의 대체 부분에 삽입합니다 sed
. 그런 다음 새 값을 삽입하십시오.
$BRANCHTAG
in 의 값에는 문자, 리터럴 개행 문자, 슬래시 또는 백슬래시 문자가 포함되어 있지 않다고 가정합니다 &
(이러한 문자는 별도로 이스케이프해야 함).
in의 값이 $PRIOR_VERSION
슬래시를 포함하지 않는 정규식이라고 가정합니다. 정규식으로 해석되므로 점(예: 점)을 이스케이프 처리해야 합니다.
당신은 또한 볼 수 있습니다"sed" 대체에 삽입된 문자열이 모든 메타 문자를 이스케이프하는지 확인하는 방법
그러나 YAML 파일을 다루고 있으므로 적절한 YAML 파서를 사용하는 것이 더 안전합니다 yq
.https://kislyuk.github.io/yq/):
yq -y --arg oldval "$PRIOR_VALUE" --arg newval "$BRANCHTAG" \
'if .newTag == $oldval then .newTag |= $newval else . end' kustomization.yaml
이는 newTag
YAML 문서에서 최상위 키로 간주되며, 현재 값이 인 경우 $newval
키 값은 명령줄의 인수에 전달된 값으로 대체됩니다. 또한 값은 파서에 의해 올바르게 인용되고 인코딩됩니다(공통 UTF-8 문자열이라고 가정). 줄 바꿈, 백슬래시 또는 기타 잠재적으로 문제가 될 수 있는 문자가 포함된 값에는 문제가 없습니다.--arg
$oldval
yq
sed
yq
--in-place
-i
내부 편집을 위해 해당 (또는 ) 옵션을 사용할 수 있습니다 .