작성일:

sed 명령어: 텍스트 패턴 캡처와 치환 활용법


sed는 파일이나 텍스트 스트림의 내용에서 특정 패턴을 찾아 변경하는 데 유용한 스트림 편집기(Stream Editor)입니다.
특히 정규 표현식 기능을 통해 텍스트의 특정 부분을 캡처하고 치환하는 기능이 강력합니다.

이번 글에서는 -E 및 -r 옵션을 사용하여 더 간편하게 캡처 그룹을 생성하고 치환하는 방법을 소개하겠습니다.

1. sed 명령어 정의 및 용도

sed는 파일이나 텍스트를 자동으로 조작하는 명령어로, 주로 Linux 및 Unix 환경에서 사용됩니다.
sed는 스크립트 없이도 다양한 텍스트 처리 작업을 쉽게 수행할 수 있는 장점이 있으며, 주요 용도는 다음과 같습니다:

  • 텍스트의 검색과 대체: 특정 패턴을 찾고 이를 다른 내용으로 바꾸기
  • 특정 범위의 텍스트 추출: 텍스트에서 원하는 구간을 추출하여 출력
  • 텍스트 삭제: 특정 패턴을 찾아 삭제하거나 특정 범위의 텍스트 삭제

2. -E 또는 -r 옵션의 활용

-E 또는 -r 옵션을 사용하면 확장 정규 표현식(Extended Regular Expressions, ERE)을 사용할 수 있어, \(와 \) 대신 그냥 (와 )로 캡처 그룹을 정의할 수 있습니다. 이는 구문을 더욱 직관적으로 작성할 수 있게 해 줍니다.

  • -E: GNU sed와 BSD sed 모두에서 사용할 수 있는 ERE 옵션
  • -r: GNU sed에서만 사용되는 ERE 옵션

-E 옵션을 활용하되, GNU sed 사용자라면 -r 옵션으로 대체하여 사용할 수 있습니다.

3. 정규 표현식을 이용한 패턴 캡처 및 치환

-E 또는 -r 옵션을 사용하여 캡처 그룹을 정의하고 치환하는 다양한 예제를 살펴보겠습니다.

예제 1: 특정 패턴을 캡처하여 치환

name: value 형식의 텍스트에서 name 부분을 캡처하여 name = value 형식으로 치환하는 예제입니다.

sed -E 's/(name): (.*)/\1 = \2/' filename
  • (name): name이라는 텍스트를 캡처합니다.
  • (.*): 임의의 텍스트를 모두 캡처합니다.
  • \1 = \2: name = value 형식으로 출력합니다.

예제 실행 결과

입력 파일 내용:
name: Alice
name: Bob

출력:
name = Alice
name = Bob

예제 2: 여러 그룹을 캡처하여 순서 변경

firstname lastname 형식의 텍스트를 lastname, firstname 형식으로 변경하는 예제입니다.

sed -E 's/([A-Za-z]+) ([A-Za-z]+)/\2, \1/' filename
  • ([A-Za-z]+): 첫 번째 단어를 캡처하여 \1로 참조합니다.
  • ([A-Za-z]+): 두 번째 단어를 캡처하여 \2로 참조합니다.
  • \2, \1: lastname, firstname 형식으로 출력합니다.

예제 실행 결과

입력 파일 내용:
John Doe
Jane Smith

출력:
Doe, John
Smith, Jane

예제 3: 숫자 패턴을 캡처하여 변형

item-1234 형식의 텍스트에서 숫자 부분을 캡처하여 code: 1234로 변경하는 예제입니다.

sed -E 's/item-([0-9]+)/code: \1/' filename
  • item-([0-9]+): 숫자 패턴을 캡처하여 \1로 참조합니다.
  • code: \1: 캡처된 숫자를 code:와 함께 출력합니다.

예제 실행 결과

입력 파일 내용:
item-1234
item-5678

출력:
code: 1234
code: 5678

예제 4: 모든 일치 항목을 치환하기 위한 g 옵션

모든 일치 항목을 변경하고 싶을 때 g 옵션을 추가하면 파일 내에서 반복되는 패턴을 모두 치환할 수 있습니다.
모든 숫자를 [Number: 숫자] 형식으로 변경하는 예제입니다.

sed -E 's/([0-9]+)/[Number: \1]/g' filename
  • ([0-9]+): 모든 숫자 패턴을 캡처하여 [Number: 숫자] 형식으로 치환합니다.
  • g 옵션을 통해 파일의 모든 숫자에 적용됩니다.

예제 실행 결과

입력 파일 내용:
item-1234 item-5678 item-91011

출력:
item-[Number: 1234] item-[Number: 5678] item-[Number: 91011]

4. 특정 범위 지정: //,// 패턴을 활용한 구간 설정

sed에서 특정 구간을 범위로 지정하여 특정 작업을 수행할 수 있습니다.
//,// 형식으로 두 패턴을 지정하면 해당 구간의 모든 줄에 작업을 적용할 수 있습니다.

예제: 두 패턴 사이의 텍스트 출력하기

start와 end로 둘러싸인 텍스트 구간을 출력하는 예제입니다.

sed -n '/start/,/end/p' filename
  • /start/: 시작 패턴
  • /end/: 끝 패턴
  • p 옵션: 구간 내 텍스트를 출력합니다.

예제 실행 결과

입력 파일 내용:
text before
start
target line 1
target line 2
end
text after

출력:
start
target line 1
target line 2
end

5. 주요 옵션 요약

  • -E 또는 -r: 확장 정규 표현식(ERE) 사용을 허용합니다.
    • 이 옵션으로 (와 ) 없이 캡처 그룹을 정의할 수 있습니다.
  • s/pattern/replacement/: 지정한 패턴을 찾고 이를 치환합니다.
  • g: 한 줄에 여러 번 나오는 패턴을 모두 치환합니다.
  • p: 찾은 줄을 출력합니다(-n 옵션과 함께 자주 사용).
  • /pattern1/,/pattern2/: 두 패턴 사이의 범위 지정에 사용됩니다.

마무리

sed는 매우 강력한 텍스트 처리 도구이며, -E 또는 -r 옵션을 사용하면 확장 정규 표현식을 사용해 더욱 직관적이고 간결하게 작업할 수 있습니다.
정규 표현식을 활용하여 다양한 패턴을 찾고 치환하거나 특정 구간의 텍스트만 추출하는 등 자동화된 텍스트 처리를 보다 수월하게 할 수 있습니다.

댓글남기기