sed - pattern capture substitute 활용
작성일:
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 옵션을 사용하면 확장 정규 표현식을 사용해 더욱 직관적이고 간결하게 작업할 수 있습니다.
정규 표현식을 활용하여 다양한 패턴을 찾고 치환하거나 특정 구간의 텍스트만 추출하는 등 자동화된 텍스트 처리를 보다 수월하게 할 수 있습니다.
댓글남기기