본문 바로가기
C.W.K.
Stream
Lesson 03 of 10 · published

sed: 스트림 편집기

~15 min · sed, substitute, in-place

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

s/from/to/ 엔진

sed는 입력을 한 줄씩 읽어 작은 편집 프로그램을 적용하고 결과를 출력해. 가장 자주 쓰는 형식은 문자열을 치환하는 s/pattern/replacement/야. 반복적인 찾아 바꾸기를 명령줄에서 재현할 수 있다는 게 핵심이야.

치환

  • sed 's/foo/bar/': 각 줄에서 첫 번째 일치만 바꿔.
  • sed 's/foo/bar/g': 각 줄의 모든 일치를 바꿔.
  • sed 's/foo/bar/I': GNU sed에서 대소문자를 무시해.
  • sed 's|/usr/local|/opt|g': 경로 안의 슬래시와 겹치지 않도록 구분자를 다른 한 글자로 바꿔.
  • sed -E 's/(foo|bar)/[\1]/g': 확장 정규식의 첫 캡처 그룹을 \1로 다시 사용해.

다른 명령

  • sed '/pattern/d': 일치하는 줄을 삭제해.
  • sed -n '5,10p' file: 기본 출력을 끄고 5번부터 10번 줄까지만 출력해.
  • sed '$d' file: 마지막 줄을 삭제해.
  • sed '1i\\ header' file: 첫 줄 앞에 텍스트를 넣어.

파일을 직접 고치는 편집

sed -i는 파일 자체를 다시 써. BSD sed를 쓰는 macOS에서는 백업 확장자 위치에 빈 인자가 필요하므로 sed -i '' 's/foo/bar/g' file처럼 실행해. GNU sed에서는 sed -i 's/foo/bar/g' file을 써. 두 구현의 차이를 없애고 싶다면 brew install gnu-sed로 GNU sed를 별도로 설치하고, 어느 명령 이름을 쓸지 스크립트에서 분명히 정해.

sed, awk, perl을 고르는 기준

sed는 줄 단위 치환, awk는 필드를 알아보는 처리, perl -pe는 전방 탐색 같은 강한 정규식이 필요할 때 잘 맞아. 셋 가운데 sed가 가장 작고 여러 환경으로 옮기기 쉬워.

sed 문법은 구현마다 달라

GNU sed와 BSD sed는 제자리 편집 옵션과 확장 정규식 옵션이 달라. 한 머신에서 성공한 sed -i 예제를 그대로 배포하지 말고 설치된 구현의 도움말을 확인해. 중요한 파일은 먼저 표준 출력으로 결과를 살펴보고 백업과 diff를 남겨.

한 줄 치환은 구조를 이해하지 못해

sed는 텍스트 패턴만 바꿀 뿐 JSON, YAML, HTML의 중첩과 이스케이프 규칙을 몰라. 구조화된 형식은 파서를 사용하고, sed는 줄 단위 계약이 분명한 입력에만 써. 짧은 명령보다 형식을 손상하지 않는 것이 우선이야.

Code

치환 패턴·bash
# foo를 모두 bar로 바꿔 표준 출력에 표시
sed 's/foo/bar/g' file.txt
# macOS BSD 구현에서 제자리 수정
sed -i '' 's/foo/bar/g' file.txt
# GNU 구현에서 제자리 수정
sed -i 's/foo/bar/g' file.txt
# 패턴에 슬래시가 있으면 구분자 바꾸기
sed 's|/usr/local|/opt/homebrew|g' install.sh
삭제 + 추출·bash
# 빈 줄 제거
sed '/^$/d' file
# 100번째부터 110번째 줄만 출력
sed -n '100,110p' big.log
# 줄 끝 공백 제거
sed -E 's/[[:space:]]+$//' file

External links

Exercise

~/.zshrc/tmp/zshrc.bak으로 복사한 뒤 sed -n '1,10p' /tmp/zshrc.bak으로 앞부분을 확인해. 이어서 sed 's/^export/EXPORT/' /tmp/zshrc.bak | head로 파일을 바꾸지 않은 결과를 먼저 살펴봐. 제자리 편집을 시험할 때는 macOS에서 sed -i '' 's/EXPORT/export/' /tmp/zshrc.bak을, Linux에서는 sed -i 's/EXPORT/export/' /tmp/zshrc.bak을 사용하고 마지막 diff까지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.