--- title: error / global-sed-env-rename-pitfalls-2026-06-06 source_type: error-note status: raw related_branches: [feature-env-driven-runtime-configuration] related_projects: [ca-skeleton] tags: [error, ca-skeleton, shell, zsh, sed, refactoring, env] created: 2026-06-06 status_label: resolved --- # error: global-sed-env-rename-pitfalls-2026-06-06 > Layer: `raw/errors/` — env 변수 일괄 rename(`DB_*`/`LOG_*`/… → `APP_*`) 중 `sed` 자동화에서 발생한 두 가지 silent 오류. ## Parent / 부모 - [[raw/branch-notes/feature-env-driven-runtime-configuration]] ## 증상 / Symptom ### 오류 1 — zsh unquoted 변수 무분할로 sed no-op (silent) ```text sed: can't read src/.env src/app-bootstrap/.../application.yml: No such file or directory ``` - 컨텍스트: `FILES="a b"; for f in $FILES; do sed -i ... "$f"; done` 형태로 두 파일에 동일 치환을 적용하려 함. - 원인: **zsh 는 bash 와 달리 unquoted 파라미터를 기본적으로 word-split 하지 않는다.** `$FILES` 가 `"a b"` 단일 토큰으로 `$f` 에 들어가 `sed` 가 `"a b"` 라는 하나의 경로를 찾다 실패. - 결과: 치환이 전혀 적용되지 않았는데 후속 grep sanity 체크에서 "구 토큰 잔존"으로 **다행히** 발각. 만약 sanity 체크가 없었다면 "rename 완료"로 오인할 뻔함. ### 오류 2 — blanket substring 치환이 Spring-native 키 훼손 ```text spring.main.log-startup-info: ${SPRING_MAIN_LOG_STARTUP_INFO} →(잘못)→ ${SPRING_MAIN_APP_LOG_STARTUP_INFO} ``` - 컨텍스트: `s/LOG_/APP_LOG_/g` 로 `LOG_*` env 그룹을 `APP_LOG_*` 로 일괄 변경. - 원인: `SPRING_MAIN_LOG_STARTUP_INFO` 는 유지해야 할 Spring-native 키인데 그 안에 부분문자열 `LOG_` 가 들어 있어 함께 치환됨. - 결과: native 키가 존재하지 않는 이름으로 바뀌어 startup 시 placeholder 미해소 위험. ## 해결 / Resolution - 오류 1: 파일별로 **절대경로를 명시한 함수 호출**로 분리(`apply `), zsh word-split 의존 제거. - 오류 2: 치환 직후 `grep -nE 'SPRING_[A-Z_]*APP_'` 로 collateral 훼손을 탐지 → 역치환 `s/SPRING_MAIN_APP_LOG_STARTUP_INFO/SPRING_MAIN_LOG_STARTUP_INFO/g` 로 복구. 이후 모든 그룹 sweep 뒤 **leftover/double-prefix sanity grep 을 강제 단계로** 둠. ## 교훈 / Lesson - **일괄 rename 은 치환 직후 sanity grep(잔존 구토큰 0 + double-prefix 0 + native 키 무손상)을 같은 명령에 묶어라.** 치환 성공을 가정하지 말 것. - substring 기반 group prefix 치환은 "유지 대상 키가 그 substring 을 포함하는가"를 먼저 점검. 포함 시 word-boundary(`perl -pe '(?