sed 명령어 사용법

텍스트 스트림을 규칙에 따라 편집하는 명령어입니다.

텍스트 처리연결 실습 문제 4개Rocky Linux 8 기준 · 실행 결과는 실습 컨테이너에서 확인

기본 문법

sed [옵션] '스크립트' 파일...

sed(stream editor)는 파일이나 표준 입력으로 들어온 텍스트를 한 줄씩 읽어 지정한 편집 규칙을 적용한 뒤 결과를 출력하는 명령어입니다. 대화형 편집기와 달리 화면을 띄우지 않고 규칙만으로 처리하므로 셸 스크립트나 자동화 작업에 넣어 쓸 수 있습니다. 많이 쓰는 기능은 치환(s), 삭제(d), 출력(p), 행 삽입(a/i)입니다.

실무에서는 설정 파일을 편집기로 열지 않고 고치는 용도로 자주 씁니다. httpd.conf의 주석 처리된 UserDir 라인을 활성화하거나, sshd_config의 PermitRootLogin 값을 no로 바꾸거나, dnf.conf의 keepcache 값을 교정하는 작업을 명령 한 줄로 처리할 수 있습니다. 여러 파일을 한 번에 고쳐야 할 때는 -i 옵션과 와일드카드를 함께 씁니다. 다만 /etc 아래의 실제 시스템 설정 파일을 직접 고칠 때는 반드시 사전에 사본을 만들고, 먼저 -i 없이 출력만 확인한 뒤 적용하세요. 서비스 설정은 변경 후 구문 검사(예: sshd -t, httpd -t)를 거치는 것이 안전합니다.

자격증 시험(리눅스마스터, RHCSA, LPIC 등)에서는 정규식과 결합한 치환 문법, -i 옵션의 백업 확장자 지정, 특정 행 범위만 처리하는 주소 지정이 자주 출제됩니다.

자주 쓰는 옵션

옵션의미
-i[SUFFIX]파일을 제자리에서 수정합니다. 접미사를 붙이면 원본을 그 이름으로 백업합니다(-i와 접미사 사이에 공백을 두지 않습니다).sed -i.bak 's/dev/prod/' app.conf
-n자동 출력을 끕니다. p 명령과 함께 원하는 행만 출력할 때 사용합니다.sed -n '5p' /etc/passwd
-e편집 스크립트를 여러 개 지정합니다.sed -e 's/a/A/' -e 's/b/B/' file.txt
-E, -r확장 정규식(ERE)을 사용합니다. GNU sed에서 두 옵션은 동일하게 동작하며, 이식성을 고려하면 -E를 권장합니다.sed -E 's/[0-9]+/N/g' file.txt
-f편집 스크립트를 파일에서 읽습니다.sed -f rules.sed input.txt
-s여러 파일을 하나로 이어붙인 스트림이 아니라 각각 별개 파일로 취급합니다(행 번호가 파일마다 새로 시작).sed -s -n '1p' a.txt b.txt
--follow-symlinks-i 사용 시 심볼릭 링크 자체가 아니라 링크가 가리키는 원본 파일을 수정합니다.sed -i --follow-symlinks 's/x/y/' link.conf

실무 예시

기본 치환

준비: mkdir -p /tmp/demo; printf 'listen_port=8080\nenv=dev\nservice_name=web\n' > /tmp/demo/web.conf

$ sed 's/8080/9090/' /tmp/demo/web.conf
listen_port=9090
env=dev
service_name=web

각 행에서 처음 일치한 문자열만 바꾼 결과를 화면에 출력합니다. 원본 파일은 변경되지 않습니다.

특정 행만 출력

준비: mkdir -p /tmp/demo; printf 'one\ntwo\nthree\nfour\nfive\n' > /tmp/demo/lines.txt

$ sed -n '2,4p' /tmp/demo/lines.txt
two
three
four

-n으로 자동 출력을 끄고 2행부터 4행까지만 p 명령으로 출력합니다. 행 범위 주소 지정 방식을 확인할 수 있습니다.

백업 남기며 제자리 수정

준비: mkdir -p /tmp/demo/conf.d; printf 'listen_port=8080\nenv=dev\n' > /tmp/demo/conf.d/web.conf; printf 'listen_port=8080\nenv=dev\n' > /tmp/demo/conf.d/api.conf

$ sed -i.bak -e 's/listen_port=8080/listen_port=9090/' -e 's/env=dev/env=prod/' /tmp/demo/conf.d/*.conf && cat /tmp/demo/conf.d/web.conf /tmp/demo/conf.d/web.conf.bak
listen_port=9090
env=prod
listen_port=8080
env=dev

-i.bak으로 원본을 web.conf.bak, api.conf.bak으로 남기면서 두 개의 치환 규칙을 여러 파일에 한 번에 적용합니다. 출력의 앞 두 행은 수정된 web.conf, 뒤 두 행은 백업본입니다.

주석 해제와 값 교정

준비: mkdir -p /tmp/demo; printf '#UserDir public_html\n#UserDir disabled root\nServerName localhost\n' > /tmp/demo/httpd.conf

$ sed -i -E 's/^#[[:space:]]*(UserDir (public_html|disabled root))$/\1/' /tmp/demo/httpd.conf && cat /tmp/demo/httpd.conf
UserDir public_html
UserDir disabled root
ServerName localhost

행 앞의 주석 기호를 제거해 설정 라인을 활성화합니다. 캡처 그룹 \1로 원래 내용을 그대로 되살립니다. 실제 /etc/httpd/conf/httpd.conf에 적용하기 전에는 사본으로 먼저 시험하고, 변경 후 httpd -t로 구문을 확인하세요.

설정 키 값 통일

준비: mkdir -p /tmp/demo; printf '#PermitRootLogin yes\nPasswordAuthentication yes\nPort 22\n' > /tmp/demo/sshd_config

$ sed -i -E -e 's/^#?[[:space:]]*PermitRootLogin.*/PermitRootLogin no/' -e 's/^#?[[:space:]]*PasswordAuthentication.*/PasswordAuthentication no/' /tmp/demo/sshd_config && cat /tmp/demo/sshd_config
PermitRootLogin no
PasswordAuthentication no
Port 22

주석 처리 여부와 기존 값에 상관없이 키를 찾아 지정한 값으로 통일합니다. 실제 /etc/ssh/sshd_config에 적용할 때는 원격 접속이 끊길 수 있으므로 백업을 남기고 sshd -t로 검사한 뒤 서비스를 재시작하세요.

주의할 점

  • s 명령은 각 행에서 첫 번째 일치만 바꿉니다. 한 행에 여러 번 나오면 끝에 g 플래그(s/a/b/g)를 붙여야 합니다.
  • -i는 되돌릴 수 없습니다. 실제 설정 파일에는 먼저 -i 없이 출력만 확인하거나 -i.bak으로 백업을 남기세요.
  • -i는 임시 파일을 만들어 교체하는 방식이므로 하드 링크가 끊기고 소유자·권한·SELinux 레이블이 달라질 수 있습니다. 시스템 파일을 고친 뒤에는 ls -lZ로 확인하고 필요하면 restorecon을 실행하세요. 심볼릭 링크의 원본을 고치려면 --follow-symlinks를 씁니다.
  • 경로처럼 /가 든 문자열은 구분자를 바꿔 s|/old|/new| 형태로 쓰면 이스케이프를 줄일 수 있습니다.
  • 기본 정규식에서는 +, ?, (), |가 특수 문자로 동작하지 않습니다. 확장 정규식이 필요하면 -E를 붙이세요.

이 명령어로 풀 수 있는 실습 문제

브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.

관련 명령어

마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.