텍스트가 포함된 yaml 파일이 있습니다.
- name: flexvol-driver-host
hostPath:
type: DirectoryOrCreate
path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
imagePullSecrets:
- name: acrrepo-bad25ec678be80
- name:.*
삭제 하려는 쉘 스크립트가 있습니다.imagePullSecrets:
오직. 그러므로 만일imagePullSecrets:
그런 다음 - name:
제거하고 imagePullSecrets:
보관만 해야 합니다.
누군가 sed를 사용하여 이 작업을 수행하도록 도와주세요.
첨부된:여러 항목을 가질 수 있습니다imagePullSecrets:
yaml 문서에서. 그래서 모두imagePullSecrets:
위와 같은 방법으로 처리해야 합니다.
답변1
지정된 행이 서로 이어지는 경우 GNU sed는 다음을 수행할 수 있습니다.
sed 'N;/\s*imagePullSecrets:\n[ -]*name:/!{P;D};s/\n.*//' file
편집기 버퍼(패턴 공간)에는 항상 두 줄이 있습니다. 패턴과 일치하지 않으면 첫 번째 줄이 인쇄된 P
다음 명령에 의해 제거 D
되고 실행이 스크립트의 맨 처음으로 이동됩니다. 즉, 다음 줄이 명령에 의해 나머지 두 번째 줄에 추가되고 N
루프가 확인합니다. 패턴과 일치하면 다시 한번 . 패턴이 발견되면 {P;D}
명령을 건너뛰고 루프를 중단한 다음 s///
바꾸기 명령이 실행되어 버퍼의 두 번째 줄이 끊어집니다. 다음 단계에서 편집기는 작업을 시작하여 다음 줄을 빈 버퍼에 로드하고, 마지막 줄이 아닌 경우 명령을 통해 다른 줄을 추가합니다 N
. 명령을 실행하는 동안 N
마지막 줄이 버퍼에 로드된 것이 발견되면 스크립트의 추가 실행이 종료되고 버퍼에 있는 한 줄이 인쇄됩니다.
sed
FreeBSD는 다르게 동작하며 마지막 홀수 행을 표시하지 않는다는 점을 인정해야 합니다 .
D
...패턴 공간에서 첫 번째 개행 문자까지 텍스트를 제거하고 새 입력 줄을 읽지 않고 결과 패턴 공간으로 루프를 다시 시작합니다.
답변2
귀하의 예제 문서는 YAML 파일이어야 하므로 Kubernetes와 관련된 다른 YAML 파일을 검색해 보니 귀하의 파일이 실제로 다음과 같을 것 같습니다.
spec:
container:
- name: flexvol-driver-host
hostPath:
type: DirectoryOrCreate
path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
imagePullSecrets:
- name: acrrepo-bad25ec678be80
YAML 파일의 들여쓰기는 중요합니다.
imagePullSecrets
섹션 자체를 삭제하지 않고 이 데이터에 있는 각 섹션의 전체 내용을 제거하려면 yq
다음을 사용할 수 있습니다.https://kislyuk.github.io/yq/)이와 같이:
$ yq -y '(.. | .imagePullSecrets? // empty) |= null' file.yml
spec:
container:
- name: flexvol-driver-host
hostPath:
type: DirectoryOrCreate
path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
imagePullSecrets: null
이는 문서의 각 섹션으로 반복되어 호출된 섹션을 꺼내고 imagePullSecrets
해당 값을 null
. 이는 섹션을 지우는 것과 같습니다.
yq
주어진 파일 내에서 내부 편집을 활성화하기 위해 해당 --in-place
(또는) 옵션 과 함께 사용됩니다.-i