본문 바로가기
linux

[TIL] sed - 텍스트 스트림 에디터

by marble25 2022. 7. 10.

요즘 쿠버네티스를 이용하면서 yaml 파일을 다룰 일이 많은데, yaml 파일에 값이 동적으로 변경되어야 하는 경우도 존재한다.
그럴 경우 기존 yaml에서 필요한 부분만 값을 세팅한 후 kubectl apply하는 방법이 유용하게 사용된다.

실제로 내 경우에는 minio를 설치할 때 kubectl krew install minio를 통해 minio를 설치하고,
kubectl minio tenant create xxx 를 통해 실제 minio 스토리지를 생성하게 된다.
하지만, minio를 설치하면서 변경하고 싶은 옵션이 있었고, 이를 위해서는 github의 kustomization에서 yaml 파일들을 모두 다운받은 후 apply하는 방법이 있을 듯 했다.
이 방법에 대해 고민해 보니, 첫 번째로는 불필요한 yaml 파일을 소스코드에 포함시키기가 싫었고, 둘째로는 하나의 옵션만 변경하는데도 yaml 파일은 example 파일이기 때문에 변경해야 하는 값들이 많아 보였다.
따라서 현재 잘 돌아가는 storage 옵션에서 감수해야 하는 리스크가 커 보였다.
물론 시간을 많이 들인다면 해결할 수 있었지만, 시간을 그렇게 많이 들일 만한 일이 아닌 것 같아 보였다.

생각해낸 방법은 현재 옵션을 yaml 파일로 뱉어낸 후, 파이프라인을 통해 내가 필요한 옵션만 변경한 후, 다시 kubectl apply를 하면 되지 않을까 싶었다.
최종적으로 나온 명령어는 다음과 같다.
kubectl minio tenant create xxx -o | sed -e "s/<변경 이전 텍스트>/<변경 이후 텍스트>/g" | kubectl apply -f -
kubectl에 의해 auto generated된 yaml 파일이 sed를 거쳐서 변경되고, 다시 그 변경된 yaml 파일이 kubectl에 적용되게 된다.
만약 여러개의 문자열을 변경하려고 한다면 다음과 같이 사용하면 된다.
sed "s/<변경 이전 텍스트1>/<변경 이후 텍스트1>/g; s/<변경 이전 텍스트2>/<변경 이후 텍스트2>/g;"

내 경우에는 변경 용도로만 사용했지만, 사실 sed는 다양한 사용 용도가 있다고 한다.
sed는 stream editor로 filtering과 transforming에 특화되어 있는 에디터이다.
따라서 대부분의 editing 기능을 포함한다.

  1. 특정 범위만큼만 출력하기
    sed -n '5,$p' a.txt: 8번 행부터 끝 행까지 출력
  2. 특정 범위 제외하고 출력하기
    sed '/abc/d' a.txt: abc가 들어간 행을 제외한 모든 행을 출력
  3. 문자열 추가
    sed '/END$/a\This is real end' a.txt: END로 끝나는 행 뒤에 This is real end를 추가
  4. 패턴스페이스와 홀드스페이스
    sed -e '/abc/h' -e '$G' a.txt: a.txt에서 abc를 찾은 후 그 행들을 홀드 스페이스에 저장한다. 그 후 마지막행 뒤에 홀드스페이스 내용을 복사

보다 자세한 내용은 다음 문서를 참고할 수 있다.

https://linux.die.net/man/1/sed

 

sed(1) - Linux man page

sed(1) - Linux man page Name sed - stream editor for filtering and transforming text Synopsis sed [OPTION]... {script-only-if-no-other-script} [input-file]... Description Sed is a stream editor. A stream editor is used to perform basic text transformations

linux.die.net

 

'linux' 카테고리의 다른 글

쉘 스크립트 기초  (0) 2023.12.25