리눅스 sed 명령어 완전 가이드 - 시나리오별 실전 활용법
리눅스 sed 명령어의 기본 개념부터 고급 활용법까지, 실제 시나리오를 통해 배워보는 완전 가이드
리눅스 sed 명령어 완전 가이드
이 글을 읽기 전에
이 가이드는 리눅스/Unix 환경에서 텍스트 처리를 위한 sed 명령어를 다룹니다. 기본적인 터미널 사용법을 알고 있다면 누구나 따라할 수 있습니다.
sed란 무엇인가?
sed(Stream Editor)는 리눅스와 Unix 시스템에서 텍스트를 처리하고 변환하는 강력한 명령어입니다. 파일이나 표준 입력에서 텍스트를 읽어서 지정된 규칙에 따라 편집한 후 결과를 출력합니다.
"하나의 도구가 하나의 일을 잘 하도록 하라" - sed는 텍스트 편집이라는 한 가지 일을 완벽하게 수행합니다.
기본 문법과 구조
sed의 기본 문법은 다음과 같습니다:
sed [옵션] '명령어' 파일명
주요 옵션들
-n: 패턴 스페이스 자동 출력 억제sed -n '1p' file.txt-i: 파일을 직접 수정 (백업 파일 생성)sed -i.bak 's/old/new/g' file.txt-e: 여러 명령어 실행sed -e 's/old1/new1/g' -e 's/old2/new2/g' file.txt-f: 스크립트 파일에서 명령어 읽기sed -f script.sed file.txt
시나리오 1: 기본 텍스트 치환
가장 기본적이고 자주 사용되는 기능인 텍스트 치환부터 시작해보겠습니다.
1.1 단순 치환
파일에서 'hello'를 'hi'로 변경sed 's/hello/hi/g' input.txt첫 번째 매치만 변경sed 's/hello/hi/' input.txt대소문자 구분 없이 치환sed 's/hello/hi/gi' input.txt
1.2 실제 파일 수정
주의사항
-i 옵션을 사용하면 원본 파일이 직접 수정됩니다. 중요한 파일을 다룰 때는 반드시 백업을 먼저 생성하세요.
백업 파일과 함께 수정sed -i.bak 's/old/new/g' config.txt백업 없이 수정 (위험!)sed -i 's/old/new/g' config.txt수정 전후 확인diff config.txt config.txt.bak
시나리오 2: 특정 라인 처리
2.1 라인 번호로 작업
3번째 라인만 출력sed -n '3p' file.txt1-5번째 라인 출력sed -n '1,5p' file.txt3번째 라인만 치환sed '3s/old/new/g' file.txt1-10번째 라인에서만 치환sed '1,10s/old/new/g' file.txt
2.2 패턴 매칭으로 라인 선택
'error'가 포함된 라인만 출력sed -n '/error/p' log.txt'error'가 포함된 라인에서 치환sed '/error/s/old/new/g' log.txt'error'가 포함된 라인 삭제sed '/error/d' log.txt'error'가 포함되지 않은 라인만 출력sed '/error/!p' log.txt
시나리오 3: 복잡한 패턴 매칭
3.1 정규표현식 활용
이메일 주소 찾기sed -n '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}/p' emails.txt전화번호 형식 변경 (010-1234-5678 → 01012345678)sed 's/([0-9]{3})-([0-9]{4})-([0-9]{4})/\1\2\3/g' phones.txtHTML 태그 제거sed 's/<[^>]*>//g' html.txt
3.2 그룹 캡처와 참조
날짜 형식 변경 (2024-12-19 → 19/12/2024)sed 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3/\2/\1/g' dates.txt파일 확장자 변경sed 's/(.*).txt/\1.md/g' files.txtURL에서 도메인 추출sed 's/.https?://([^/]).*/\1/' urls.txt
시나리오 4: 다중 명령어와 조건부 처리
4.1 여러 명령어 조합
여러 치환을 한 번에 수행sed -e 's/old1/new1/g' -e 's/old2/new2/g' -e 's/old3/new3/g' file.txt또는 세미콜론으로 구분sed 's/old1/new1/g; s/old2/new2/g; s/old3/new3/g' file.txt
4.2 조건부 처리
'error' 라인에서만 치환하고, 'warning' 라인은 삭제sed '/error/s/old/new/g; /warning/d' log.txt특정 라인 범위에서만 작업sed '5,10{/pattern/s/old/new/g}' file.txt패턴이 매치되면 다음 라인까지 처리sed '/start/,/end/s/old/new/g' file.txt
시나리오 5: 실제 개발 환경 활용
5.1 로그 파일 처리
실무 팁
로그 파일 처리는 sed의 가장 일반적인 사용 사례 중 하나입니다.
ERROR 레벨 로그만 추출sed -n '/ERROR/p' app.log타임스탬프 제거sed 's/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9:]* //' app.log특정 IP 주소의 로그만 추출sed -n '/192.168.1.100/p' access.log로그 레벨별 색상 변경 (터미널에서)sed 's/ERROR/\x1b[31mERROR\x1b[0m/g; s/WARN/\x1b[33mWARN\x1b[0m/g' app.log
5.2 설정 파일 수정
환경 변수 값 변경sed -i 's/^DB_HOST=.*/DB_HOST=localhost/' .env주석 처리sed -i 's/^#(.)/#\1/' config.conf주석 해제sed -i 's/^#(.*)/\1/' config.conf특정 섹션에서만 수정sed -i '/[database]/,/[/s/^host=.*/host=localhost/' config.ini
5.3 코드 리팩토링
함수명 변경sed -i 's/oldFunctionName/newFunctionName/g' *.jsimport 경로 수정sed -i 's/from "./old/path"/from "./new/path"/g' *.ts변수명 일괄 변경sed -i 's/\bvar\b/let/g' *.js들여쓰기 수정 (탭을 스페이스로)sed -i 's/\t/ /g' *.py
시나리오 6: 고급 기능과 트릭
6.1 라인 조작
특정 라인 삭제sed '5d' file.txt # 5번째 라인 삭제
sed '1,5d' file.txt # 1-5번째 라인 삭제
sed '/pattern/d' file.txt # 패턴이 매치되는 라인 삭제라인 삽입sed '3i\새로운 라인' file.txt # 3번째 라인 앞에 삽입
sed '3a\새로운 라인' file.txt # 3번째 라인 뒤에 삽입라인 교체sed '3c\교체된 라인' file.txt # 3번째 라인 교체
6.2 파일 분할과 병합
특정 패턴을 기준으로 파일 분할sed -n '/^===/,/^===/p' input.txt > section1.txt라인 번호로 분할sed -n '1,100p' large_file.txt > part1.txt
sed -n '101,200p' large_file.txt > part2.txt빈 라인을 기준으로 섹션 분할sed '/^$/q' input.txt > first_section.txt
6.3 조건부 치환과 변환
첫 번째 매치만 치환sed '0,/pattern/s/old/new/' file.txt마지막 매치만 치환sed ':a;N;$!ba;s/old/new/' file.txt특정 횟수만큼 치환sed 's/old/new/2' file.txt # 2번째 매치만 치환매치된 부분만 출력sed -n 's/pattern/&/p' file.txt
시나리오 7: 성능 최적화와 주의사항
7.1 대용량 파일 처리
성능 고려사항
대용량 파일을 처리할 때는 메모리 사용량과 처리 속도를 고려해야 합니다.
메모리 효율적인 처리sed -n '1,1000p' large_file.txt # 청크 단위로 처리병렬 처리 (GNU parallel 사용)parallel -a file_list.txt sed 's/old/new/g' {} > {}.new임시 파일 사용sed 's/old/new/g' large_file.txt > temp_file && mv temp_file large_file.txt
7.2 안전한 사용법
항상 백업 생성cp original.txt original.txt.backup
sed -i 's/old/new/g' original.txt변경사항 미리보기sed 's/old/new/g' file.txt | diff file.txt -드라이 런 (실제 변경 없이 확인)sed 's/old/new/g' file.txt | head -10정규표현식 이스케이프sed 's/[/\[/g' file.txt # 대괄호 이스케이프
sed 's/./\./g' file.txt # 점 이스케이프
실전 연습 문제
기본 치환 연습
다음 텍스트에서 모든 'hello'를 'hi'로 변경하세요:
hello world
hello there
goodbye hello
라인 선택 연습
로그 파일에서 ERROR 레벨 메시지만 추출하세요:
2024-12-19 10:00:01 INFO: Application started
2024-12-19 10:00:02 ERROR: Database connection failed
2024-12-19 10:00:03 WARN: High memory usage
2024-12-19 10:00:04 ERROR: File not found
패턴 매칭 연습
이메일 주소만 추출하세요:
Contact: john@example.com
Phone: 010-1234-5678
Email: jane@test.org
자주 묻는 질문
Q: sed와 awk의 차이점은 무엇인가요?
sed는 주로 텍스트 치환과 편집에 특화되어 있고, awk는 데이터 처리와 분석에 더 적합합니다. sed는 라인 단위로 작업하고, awk는 필드 단위로 작업할 수 있습니다.
Q: 왜 -i 옵션을 사용할 때 백업이 필요한가요?
-i 옵션은 원본 파일을 직접 수정하므로, 실수로 잘못된 변경을 하면 되돌릴 수 없습니다. 백업 파일이 있으면 언제든 원래 상태로 복원할 수 있습니다.
마무리
sed는 리눅스 시스템에서 텍스트 처리를 위한 가장 강력한 도구 중 하나입니다. 기본적인 치환부터 복잡한 패턴 매칭까지, 다양한 시나리오에서 활용할 수 있습니다.
핵심 포인트
- 항상 백업을 먼저 생성하세요
- 정규표현식을 점진적으로 테스트하세요
- 대용량 파일 처리 시 성능을 고려하세요
- 실무에서는 sed 스크립트 파일을 활용하세요
추가 학습 자료
완료! 이제 sed 명령어를 마스터하여 텍스트 처리 작업을 효율적으로 수행할 수 있습니다!