iBetter Books
수정

치환과 삭제

sed에서 가장 많이 쓰는 명령어는 단연 s입니다. 텍스트를 찾아서 바꾸는 치환 명령어입니다. 파이프라인에서 특정 단어를 교체하거나, 설정 파일의 값을 수정하거나, 포맷을 변환하는 일 모두 s 명령어로 처리합니다.

s 명령어 기본 구문

sed 's/찾을패턴/바꿀내용/플래그' 파일

슬래시 세 개로 세 영역을 나눕니다. 첫 번째는 찾을 패턴, 두 번째는 바꿀 내용, 세 번째는 플래그입니다.

기본 동작은 줄당 첫 번째 매칭만 교체합니다.

echo "the cat sat on the mat" | sed 's/the/a/'
a cat sat on the mat

첫 번째 the만 바뀌었습니다. 두 번째 the는 그대로입니다.

플래그

플래그 동작
g 줄의 모든 매칭 교체
i 대소문자 구분 없이 검색
p 치환된 줄 출력 (-n과 함께 사용)
w 파일명 치환된 줄을 파일에 저장
숫자 n번째 매칭만 교체

전체 교체 (g 플래그).

echo "the cat sat on the mat" | sed 's/the/a/g'
a cat sat on a mat

대소문자 무시 (i 플래그).

echo "Hello HELLO hello" | sed 's/hello/hi/gi'
hi hi hi

치환된 줄만 출력 (p 플래그).

-np를 조합하면 실제로 치환이 일어난 줄만 확인할 수 있습니다.

cat > /tmp/config.txt << 'EOF'host=localhostport=8080debug=falsehost=backup-serverEOFsed -n 's/host=/server=/p' /tmp/config.txt
server=localhost
server=backup-server

구분자 변경

파일 경로처럼 슬래시가 포함된 문자열을 치환할 때 슬래시를 구분자로 쓰면 이스케이프가 복잡해집니다. 다른 문자를 구분자로 사용할 수 있습니다. 관습적으로 |, #, @를 씁니다.

# 슬래시 이스케이프 방식 (가독성 나쁨)sed 's/\/usr\/bin/\/usr\/local\/bin/g' file# 파이프를 구분자로 (훨씬 읽기 쉬움)sed 's|/usr/bin|/usr/local/bin|g' file

-i 옵션: 원본 파일 직접 수정

지금까지는 결과를 표준 출력으로만 봤습니다. -i 옵션을 사용하면 원본 파일을 직접 수정합니다.

# 원본 파일 수정sed -i 's/debug=false/debug=true/' /tmp/config.txt# 수정 결과 확인cat /tmp/config.txt
host=localhost
port=8080
debug=true
host=backup-server

원본을 바꾸기 전에 백업을 만들고 싶다면 -i 뒤에 확장자를 붙입니다.

# .bak 백업 파일 생성 후 수정sed -i.bak 's/port=8080/port=9090/' /tmp/config.txt# 백업 확인cat /tmp/config.txt.bak   # 원본cat /tmp/config.txt       # 수정본

패턴으로 줄 삭제

d 명령어에 주소 패턴을 붙이면 조건에 맞는 줄을 삭제합니다.

cat > /tmp/nginx.conf << 'EOF'server {    # 기본 설정    listen 80;    # 보안 설정    server_name example.com;    root /var/www/html;}EOF# 주석 줄 삭제sed '/^\s*#/d' /tmp/nginx.conf
server {
    listen 80;
    server_name example.com;
    root /var/www/html;
}

실습 1. HTML 태그 제거

웹에서 긁어온 텍스트에서 HTML 태그를 제거합니다.

cat > /tmp/sample.html << 'EOF'<h1>제목입니다</h1><p>첫 번째 문단입니다.</p><p>두 번째 <strong>문단</strong>입니다.</p>EOF# HTML 태그 제거: <...> 패턴을 빈 문자열로 교체sed 's/<[^>]*>//g' /tmp/sample.html
제목입니다
첫 번째 문단입니다.
두 번째 문단입니다.

[^>]*> 이외의 문자가 0개 이상 반복되는 패턴입니다. <> 사이의 내용을 통째로 매칭합니다.

실습 2. 설정 파일에서 주석과 빈 줄 함께 제거

실무에서 자주 쓰는 조합입니다.

cat > /tmp/app.conf << 'EOF'# 애플리케이션 설정# 2024년 01월 작성app_name=myapp# 데이터베이스 설정db_host=localhostdb_port=5432# 로그 설정log_level=infoEOF# 주석(#으로 시작)과 빈 줄 동시 제거sed -e '/^\s*#/d' -e '/^$/d' /tmp/app.conf
app_name=myapp
db_host=localhost
db_port=5432
log_level=info

-e를 반복하면 여러 명령어를 순서대로 적용합니다. 첫 번째 -e가 주석을 제거하고, 두 번째 -e가 빈 줄을 제거합니다.

다음 절에서는 줄 번호와 패턴을 조합한 주소 범위를 살펴보겠습니다.