sed 기본 명령어
텍스트 편집기는 파일을 열고, 커서를 움직이고, 저장합니다. 사람이 직접 조작하는 방식입니다. sed는 다릅니다. 파일을 열지 않습니다. 명령어 한 줄을 받아서 스트림처럼 흘러가는 텍스트에 작업을 수행하고 결과를 출력합니다. 그래서 이름이 스트림 편집기(Stream Editor)입니다.
sed 동작 원리
sed는 파일을 한 줄씩 읽습니다. 읽은 줄을 패턴 스페이스(pattern space)라는 임시 공간에 올려놓고, 주어진 명령어를 적용한 뒤 출력합니다. 그리고 다음 줄로 넘어갑니다. 이 과정이 파일 끝까지 반복됩니다.
기본 문법은 아래와 같습니다.
sed [옵션] '명령어' 파일sed [옵션] -e '명령어1' -e '명령어2' 파일
여러 명령어를 적용하려면 -e를 반복하거나 세미콜론으로 구분합니다.
기본 명령어
| 명령어 | 동작 | 예시 |
|---|---|---|
p |
현재 줄 출력 | sed 'p' file |
d |
현재 줄 삭제(출력 안 함) | sed 'd' file |
q |
처리 종료 | sed '5q' file |
i |
현재 줄 앞에 텍스트 삽입 | sed 'i\텍스트' file |
a |
현재 줄 뒤에 텍스트 추가 | sed 'a\텍스트' file |
c |
현재 줄을 텍스트로 교체 | sed 'c\텍스트' file |
-n 옵션
sed는 기본적으로 모든 줄을 출력합니다. p 명령어를 쓰면 같은 줄이 두 번 나옵니다. 이를 막으려면 -n 옵션을 사용합니다. -n은 자동 출력을 억제합니다. p 명령어가 명시된 줄만 출력됩니다.
# -n 없이 p 사용: 모든 줄 + p가 출력한 줄 = 두 번씩sed 'p' /etc/hostname# -n과 p 조합: p가 명시한 줄만 출력sed -n 'p' /etc/hostname
실습
실습에 사용할 샘플 파일을 만들겠습니다.
# 파일: /tmp/sample.txtcat > /tmp/sample.txt << 'EOF'applebananacherrydateelderberryfiggrapeEOF
특정 줄 출력.
줄 번호를 명령어 앞에 붙이면 해당 줄에만 명령어를 적용합니다.
# 3번째 줄만 출력sed -n '3p' /tmp/sample.txt
cherry
처음 5줄만 출력.
q는 지정한 줄에서 처리를 종료합니다. head 명령어처럼 동작합니다.
# 처음 5줄 출력 후 종료sed '5q' /tmp/sample.txt
apple
banana
cherry
date
elderberry
빈 줄 삭제.
실제 파일에는 빈 줄이 섞여 있는 경우가 많습니다. 정규표현식 ^$는 시작과 끝 사이에 아무것도 없는 줄, 즉 빈 줄을 의미합니다.
# 빈 줄이 포함된 파일 생성cat > /tmp/with_blank.txt << 'EOF'first linesecond linethird lineEOF# 빈 줄 삭제sed '/^$/d' /tmp/with_blank.txt
first line
second line
third line
줄 범위 출력.
쉼표로 시작 줄과 끝 줄을 지정하면 범위를 처리합니다.
# 2번째부터 4번째 줄 출력sed -n '2,4p' /tmp/sample.txt
banana
cherry
date
줄 앞에 텍스트 삽입.
i 명령어는 지정한 줄 앞에 텍스트를 끼워 넣습니다. 파일에 헤더를 추가하거나 특정 줄 앞에 주석을 달 때 유용합니다.
# 1번째 줄 앞에 헤더 삽입sed '1i\--- Fruit List ---' /tmp/sample.txt
--- Fruit List ---
apple
banana
cherry
date
elderberry
fig
grape
이처럼 sed는 파이프라인 중간에서 텍스트를 조용히 변환합니다. 다음 절에서는 sed의 핵심 기능인 치환 명령어를 살펴보겠습니다.