sd - 직관적 찾기 및 교체 CLI 치트시트
sd는 Rust로 작성한 빠른 찾기 및 교체 명령줄 도구로, 일반적인 경우를 간단하게 만들도록 설계되었다. sed가 암호화된 문법, 취약한 이스케이프, BSD/GNU 차이가 있는 반면, sd는 직관적 정규식 (또는 리터럴 문자열), 명백한 캡처 그룹 참조 ($1), 그리고 파일을 안전하게 읽고 쓴다. 일상적인 “이 파일들에 걸쳐 X를 Y로 교체”라는 작업에서, sed보다 올바르게 얻기가 훨씬 더 쉽다.
설치
| 플랫폼 | 명령어 |
|---|
| Cargo (모든 플랫폼) | cargo install sd |
| macOS (Homebrew) | brew install sd |
| Arch Linux | sudo pacman -S sd |
| Debian/Ubuntu | sudo apt install sd |
| Fedora | sudo dnf install sd |
| 확인 | sd --version |
기본 사용
sd는 stdin 또는 파일을 읽는다. 형식은 sd FIND REPLACE [FILES...]다.
| 명령어 | 설명 |
|---|
| `echo “hello” | sd hello world` |
sd 'before' 'after' file.txt | 파일에서 교체 (제자리) |
sd 'before' 'after' *.txt | 많은 파일에 걸쳐 교체 |
sd --help | 전체 옵션 목록 |
리터럴 vs 정규식
| 명령어 | 행동 |
|---|
sd 'a.b' 'X' file | 정규식: .는 모든 문자와 일치 |
sd -s 'a.b' 'X' file | 리터럴 문자열 (-s/--string-mode) |
sd '\d+' 'N' file | 정규식 자릿수 클래스 |
검색 텍스트에 정규식 메타문자가 포함되어 있을 때 리터럴로 취급하고 싶을 때 -s를 사용하자 — 수동 이스케이프 없음.
캡처 그룹
sd는 간단한 $1, $2 참고를 사용한다 (또는 텍스트와 인접할 때 ${1}).
# "Ada Lovelace"를 "Lovelace, Ada"로 스왑
echo "Ada Lovelace" | sd '(\w+) (\w+)' '$2, $1'
# → Lovelace, Ada
# 날짜를 YYYY-MM-DD에서 DD/MM/YYYY로 재포매팅
sd '(\d{4})-(\d{2})-(\d{2})' '$3/$2/$1' dates.txt
# 그룹이 자릿수/문자를 뒤따를 때 괄호 사용
echo "v2" | sd 'v(\d)' 'version${1}0' # → version20
주요 옵션
| 옵션 | 설명 |
|---|
-s, --string-mode | FIND/REPLACE를 리터럴 문자열로 취급 |
-p, --preview | 쓰기 없이 diff/결과 표시 |
-f, --flags FLAGS | 정규식 플래그: i (대소 구분 없음), m, s 등 |
-n, --max-replacements N | 교체 수 제한 |
| stdin/stdout | 파일을 생략하여 필터로 작동 |
정규식 플래그 (-f)
| 플래그 | 효과 |
|---|
i | 대소 구분 없음 |
m | 다중 라인 (^/$는 라인 경계와 일치) |
s | 점이 개행과 일치 |
w | 전체 단어와 일치 |
# 대소 구분 없는 교체
sd -f i 'error' 'ERROR' log.txt
안전 미리보기
# 파일을 터치하기 전에 무엇이 변경될지 보기
sd -p 'foo' 'bar' src/*.rs
# 그 후 적용
sd 'foo' 'bar' src/*.rs
일반적인 워크플로우
# 코드베이스 전체에 걸쳐 심볼 이름 바꾸기 (먼저 미리보기)
sd -p 'oldFunctionName' 'newFunctionName' **/*.js
sd 'oldFunctionName' 'newFunctionName' **/*.js
# 후행 공백 제거
sd ' +$' '' file.txt
# 리터럴 경로 교체 (문자열 모드는 점/슬래시 이스케이프 피함)
sd -s './old/path.js' './new/path.js' config.json
# 체인의 파이프 사용
cat access.log | sd '\d+\.\d+\.\d+\.\d+' '[REDACTED_IP]'
sd vs sed
| 측면 | sd | sed |
|---|
| 문법 | 간단, 현대 정규식 | 간략, 역사적 |
| 캡처 참고 | $1, $2 | \1, \2 |
| 리터럴 모드 | -s (이스케이프 없음) | 수동 이스케이프 |
| 제자리 | 파일 기본값 | -i (BSD/GNU 차이) |
| 스트리밍 편집 (sed 스타일) | 교체에 포커스 | 전체 스트림 편집기 |
sd는 포커스가 맞춰진 찾기 및 교체; 치환 이상으로의 스트림 편집의 경우, sed/awk가 여전히 적용된다. 교체가 아닌 검색의 경우, ripgrep과 페어링하자.
자료