콘텐츠로 이동

sd - 직관적 찾기 및 교체 CLI 치트시트

sd - 직관적 찾기 및 교체 CLI 치트시트

sd는 Rust로 작성한 빠른 찾기 및 교체 명령줄 도구로, 일반적인 경우를 간단하게 만들도록 설계되었다. sed가 암호화된 문법, 취약한 이스케이프, BSD/GNU 차이가 있는 반면, sd는 직관적 정규식 (또는 리터럴 문자열), 명백한 캡처 그룹 참조 ($1), 그리고 파일을 안전하게 읽고 쓴다. 일상적인 “이 파일들에 걸쳐 X를 Y로 교체”라는 작업에서, sed보다 올바르게 얻기가 훨씬 더 쉽다.

설치

플랫폼명령어
Cargo (모든 플랫폼)cargo install sd
macOS (Homebrew)brew install sd
Arch Linuxsudo pacman -S sd
Debian/Ubuntusudo apt install sd
Fedorasudo 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-modeFIND/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

측면sdsed
문법간단, 현대 정규식간략, 역사적
캡처 참고$1, $2\1, \2
리터럴 모드-s (이스케이프 없음)수동 이스케이프
제자리파일 기본값-i (BSD/GNU 차이)
스트리밍 편집 (sed 스타일)교체에 포커스전체 스트림 편집기

sd는 포커스가 맞춰진 찾기 및 교체; 치환 이상으로의 스트림 편집의 경우, sed/awk가 여전히 적용된다. 교체가 아닌 검색의 경우, ripgrep과 페어링하자.

자료