CodeGym /행동 /Docker SELF /sed를 사용한 텍스트 변환

sed를 사용한 텍스트 변환

Docker SELF
레벨 8 , 레슨 1
사용 가능

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)를 사용할 때는 올바르게 지정되어 있는지 확인해. 파일이 비어 있으면 안 돼.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION