본문 바로가기

셸에서 텍스트 치환하기 (feat. sed)

기술적인 이야기/터미널 및 셸 2023. 12. 6.
반응형

리눅스나 맥 등에서 개발이나 배포 과정을 자동화하기 위해 셸 스크립트를 이용하는 경우가 많다. 특히 보안 키 등 설정 파일에서 공개 저장소에 배포하기 꺼려지는 부분들은 비워놓고 실제 배포 등에서만 치환되게 하고자 하는 경우가 종종 있다.

이럴 때 쉽게 쓸 수 있는 방법은 오래(?) 되었지만 잘 작동하는 친구인 sed를 활용할 수 있다. 사용하는 패턴 방식도 Vim이나 Perl의 것과 비슷하기에 쉽게 쓸 수 있다.

예를 들어 특정 INPUTFILE의 내용을 읽어서 OLD라는 문자를 NEW로 치환해서 OUTPUTFILE로 저장하고 싶다면 아래와 같이 입력할 수 있다.

sed "s/OLD/NEW/g" INPUTFILE > OUTPUTFILE

sed의 매개변수로 전달된 패턴 표현식은 Vim이나 Perl에서 사용하는 정규표현식(Regular Expression)과 굉장히 유사하다. 따라서 해당 정규표현식 패턴만 더 찾아보면 자유자재로 이용할 수 있을 것 같다.

참고로 오른쪽 방향 꺽쇠(>)는 아는 사람은 알겠지만 sed의 표준 출력(stdout)을 파일로 저장하기 위한 명령이다. 더 쉽게 말하자면 터미널 화면에 표시되는 내용을 그대로 파일에 저장한다는 말이다. 이 부분을 파일이 아닌 다른 파이프로 던져줘서 자유자재로 사용할 수 있는 점은 유닉스 유틸리티 다운 부분이다.

cat INPUTFILE | \
    sed "s/OLD/NEW/g" | \
    less

위와 같은 식으로 작성하면 INPUTFILE의 내용을 읽어서 텍스트 치환을 거치고 해당 내용을 less로 볼 수 있다. 물론 굳이 cat을 이용할 필요는 없었지만 그저 파이프로도 동작한다는 것을 보여주고 싶었을 뿐이다.

좀 더 실제로 동작하는 예제는 아래가 있을 것 같다. 별도의 파일도 필요 없고 바로 실행시켜 볼 수 있다.

echo 'email = "ENTER YOUR EMAIL"' | \
    sed "s/ENTER YOUR EMAIL/theuser@foo.bar/g"

이렇게 하면 화면에 아래와 같은 내용이 출력된다.

email = "theuser@foo.bar"

실제 터미널에서 실행된 모습

이런 식으로 원하는 부분을 치환해서 보안에 민감한 코드를 저장소에 올리지 않기에 도움이 될 수 있을 것 같다. 개인적으로는 자동화 셸 스크립트에서 종종 사용하게 될 것 같다.

728x90
반응형

댓글