우분투 실전 명령어 | sed로 안전하게 일괄 치환하기
설정 파일이나 로그를 여러 대에서 한꺼번에 손볼 때 sed를 제대로 쓰면 수작업 시간을 크게 줄일 수 있습니다. 특히 배포 전 환경값 치환, 레거시 경로 교체, 불필요한 라인 정리 같은 작업에서 바로 효과가 납니다.
언제 쓰는가
.env, nginx, systemd 유닛 파일에서 문자열을 일괄 교체해야 할 때- 로그/CSV에서 특정 패턴 라인만 추출하거나 제거할 때
- 변경 전후 diff를 확인하면서 안전하게 파일을 수정하고 싶을 때
바로 쓰는 명령어
# 파일 원본 백업(.bak) 남기고 문자열 교체
sed -i.bak 's|APP_ENV=dev|APP_ENV=prod|g' /etc/myapp/app.env
# 주석/빈 줄 제거해서 유효 설정만 보기
sed -E '/^\s*($|#)/d' /etc/nginx/nginx.conf
# 여러 파일에 공통 치환 적용 (확장자 .conf만)
find /etc/nginx/conf.d -type f -name '*.conf' -print0 \
| xargs -0 sed -i.bak 's|127.0.0.1:8080|unix:/run/app.sock|g'
핵심 옵션/패턴
-i.bak: 인플레이스 수정 + 즉시 롤백 가능한 백업 파일 생성- 구분자
|: 경로(/var/www/...) 치환 시/이스케이프를 줄여 가독성 개선 -E: 확장 정규식 활성화로 패턴을 짧게 작성/pattern/d: 조건에 맞는 라인 삭제s|old|new|g: 한 줄에서 여러 번 등장하는 패턴까지 전부 치환
명령 출력 예시
$ sed -i.bak 's|APP_ENV=dev|APP_ENV=prod|g' app.env
$ grep '^APP_ENV' app.env
APP_ENV=prod
$ grep '^APP_ENV' app.env.bak
APP_ENV=dev
$ sed -E '/^\s*($|#)/d' sample.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
자주 하는 실수
-i를 백업 없이 사용해서 되돌릴 지점을 잃어버림- 정규식의
.*를 과하게 써서 의도하지 않은 라인까지 치환함 - YAML/INI에서 공백 정렬을 깨서 서비스 재시작 시 파싱 에러가 남
find | xargs조합에서 공백 파일명을 고려하지 않아 일부 파일이 누락됨
검증 방법
# 변경 전후 차이 확인
for f in /etc/nginx/conf.d/*.conf; do
[ -f "$f.bak" ] && diff -u "$f.bak" "$f" || true
done
# 치환 결과 카운트 확인
grep -R "unix:/run/app.sock" /etc/nginx/conf.d | wc -l
# 설정 문법 점검 후 재적용
nginx -t && sudo systemctl reload nginx
운영 팁
대상 파일이 많을수록 바로 -i를 치기보다 먼저 sed 's|old|new|g' file | less로 미리보기한 뒤 적용하는 편이 안전합니다. 운영 서버에서는 백업 파일을 같은 디렉터리에 남기고, 검증이 끝난 뒤 한 번에 정리하면 롤백 속도가 훨씬 빨라집니다.
출처
- GNU sed Manual
- POSIX sed Specification
- Linux man-pages Project