sed
를 사용한 텍스트 변환
1. sed 명령어 문법
sed
란?
sed
(영어로 Stream Editor, 즉 스트림 편집기의 약자)는 텍스트 파일과 데이터 스트림에서 줄을 변경, 추가, 삭제 또는 변환할 수 있는 강력한 텍스트 처리 유틸리티야.
sed
의 주요 마법은 원본 파일을 건드리지 않고 텍스트를 "즉석에서" 편집하는 데 있어 (물론 네가 원하면 원본 파일도 수정할 수 있어). 이 때문에 데이터를 빠르고 자동으로 변환하는 데 이상적인 도구야.
기본 명령어 문법
sed
를 사용하기 위한 기본 공식은 이거야:
sed [옵션] '패턴/작업' 파일
여기서:
패턴
— 검색할 텍스트나 정규 표현식.작업
— 네가 수행하고 싶은 작업 (예: 텍스트 교체).파일
— 네가 변경하고 싶은 줄을 포함하고 있는 텍스트 파일.
처음엔 간단하게 가장 인기 있는 작업에 집중하자: 텍스트 교체 (s
— "substitute"의 약자)와 줄 삭제 (d
— "delete"의 약자).
2. 텍스트 대체 s/old/new/
예제 1: 기본 텍스트 대체
다음과 같이 example.txt
파일이 있다고 가정해보자:
Hello world!
Welcome to Linux.
Linux is awesome.
단어 "Linux"를 sed
로 바꿔보자:
sed 's/Linux/sed/' example.txt
출력은 다음과 같을 거야:
Hello world!
Welcome to sed.
sed is awesome.
이게 다임. 단어 "Linux"는 각 줄에서 한 번만 sed
로 대체됐어. 이게 기본 동작이야.
예제 2: 글로벌 대체
모든 단어를 대체하고 싶다면, 줄의 첫 번째만 아니라 g
(글로벌) 플래그를 추가하면 돼:
sed 's/Linux/sed/g' example.txt
줄에 "Linux"라는 단어가 여러 번 언급되었을 경우, 모두 sed
로 대체될 거야.
예제 3: 대소문자 무시
케이스를 무시하고 텍스트를 대체하려면 I
(혹은 버전에 따라 i
) 플래그를 추가하세요:
sed 's/linux/sed/gi' example.txt
"Linux", "LINUX", "LiNuX" 등도 대체될 거야.
예제 4: 결과 저장하기
기본적으로 sed
는 결과를 콘솔에 출력만 하고 파일은 변경하지 않아. 변경 사항을 파일에 저장하고 싶다면 -i
(in-place) 옵션을 추가하세요:
sed -i 's/Linux/sed/g' example.txt
이제 example.txt
파일이 대체 결과로 업데이트돼.
3. 줄 삭제 /패턴/d
예제 1: 패턴에 따라 줄 삭제
만약 "Linux"라는 단어를 포함한 모든 줄을 삭제하고 싶다면:
sed '/Linux/d' example.txt
출력은 다음과 같습니다:
Hello world!
여기서는 "Linux"가 들어 있는 줄이 삭제되었습니다.
번호에 의한 줄 삭제
줄 번호에 따라 줄을 삭제할 수 있습니다. 예를 들어, 두 번째 줄을 삭제하려면:
sed '2d' example.txt
출력:
Hello world!
Linux is awesome.
여러 줄 삭제: 범위를 지정하여 2번째부터 3번째 줄까지 삭제하려면:
sed '2,3d' example.txt
4. 정규 표현식 사용
이게 바로 sed
가 진가를 발휘하는 곳이야! 패턴에서 정규 표현식을 사용해 더 복잡한 매칭을 찾을 수 있어.
예제 1: 특정 패턴의 단어 대체
텍스트에 다음과 같은 줄이 있다고 해보자:
error: something went wrong
warning: check your system
error: unable to connect
"error"로 시작하는 모든 줄을 "Issue Detected"로 바꾸고 싶어. 정규 표현식이 여기서 도움을 줄 거야:
sed 's/^error:.*/Issue Detected/' logs.txt
여기서:
^
— 줄의 시작을 나타냄..*
— "그 뒤에 무엇이든"을 의미.
결과:
Issue Detected
warning: check your system
Issue Detected
5. 줄 삽입 및 추가
일치하는 내용 앞에 줄 삽입하기
"Linux"를 포함하는 각 줄 앞에 줄을 삽입하려면:
sed '/Linux/i\# Learning is fun' example.txt
결과:
Hello world!
Welcome to Linux.
# Learning is fun
Linux is awesome.
예제 2: 일치하는 내용 뒤에 줄 추가하기
패턴이 있는 줄 뒤에 텍스트를 추가하려면:
sed '/Linux/a\# sed makes it easier' example.txt
결과:
Hello world!
Welcome to Linux.
# sed makes it easier
Linux is awesome.
# sed makes it easier
6. 실습: 구성 파일 처리
실제 과제를 해결해볼까 해. config.txt
라는 구성 파일이 있다고 가정해볼게:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
과제 1: "localhost"를 "127.0.0.1"로 변경하기
sed -i 's/localhost/127.0.0.1/' config.txt
결과:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
과제 2: 포트를 1만큼 증가시키기
이 작업을 위해 sed
와 작은 트릭을 사용할게:
sed -i 's/port=8080/port=8081/' config.txt
결과:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
과제 3: logfile
이 포함된 줄 삭제하기
구성이 더 이상 로그를 기록할 필요가 없다면, 줄을 삭제해보자:
sed -i '/logfile/d' config.txt
결과:
host=127.0.0.1
port=8081
mode=production
7. 다른 명령어와의 조합
sed
는 Linux의 다른 도구들과 훌륭히 연동돼. 예를 들면:
grep "error" logs.txt | sed 's/error/ERROR/'
여기서는 먼저 오류가 포함된 줄을 찾아서 포맷을 변경해.
일반적인 실수와 이를 피하는 방법
- 실수:
-i
옵션을 잊어버림. 초보자들은 종종sed
가 파일을 변경할 거라고 예상하지만,-i
를 추가하지 않아. 파일을 변경하려면 반드시 이를 명시적으로 추가해. - 실수: 따옴표. 일부 시스템에서 특히 작은따옴표를 사용할 경우, 특수 문자 앞에
\
를 사용할 때 올바르게 동작하지 않을 수도 있어. 항상 정확히 문자를 이스케이핑해. - 실수: 줄 범위. 줄 범위(예:
2,3d
)를 사용할 때는 올바르게 지정되어 있는지 확인해. 파일이 비어 있으면 안 돼.
GO TO FULL VERSION