sed 명령은 개행 패턴을 포함하는 패턴을 공백으로 바꿉니다.

sed 명령은 개행 패턴을 포함하는 패턴을 공백으로 바꿉니다.

텍스트가 포함된 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마지막 줄이 버퍼에 로드된 것이 발견되면 스크립트의 추가 실행이 종료되고 버퍼에 있는 한 줄이 인쇄됩니다.

sedFreeBSD는 다르게 동작하며 마지막 홀수 행을 표시하지 않는다는 점을 인정해야 합니다 .

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

관련 정보