iBetter Books
수정

주소 범위와 정규표현식

sed의 모든 명령어는 주소(address)와 함께 쓸 수 있습니다. 주소란 "어떤 줄에 이 명령어를 적용할지"를 지정하는 것입니다. 주소 없이 쓰면 모든 줄에 적용되고, 주소를 지정하면 해당 줄에만 적용됩니다.

줄 번호 주소

가장 단순한 주소 형식입니다. 숫자로 줄을 지정합니다.

cat > /tmp/data.txt << 'EOF'line 1: headerline 2: data Aline 3: data Bline 4: data Cline 5: footerEOF# 3번 줄만 출력sed -n '3p' /tmp/data.txt# 2번부터 4번 줄 출력sed -n '2,4p' /tmp/data.txt# 마지막 줄 출력 ($는 마지막 줄을 의미)sed -n '$p' /tmp/data.txt# 2번부터 마지막 줄까지 삭제sed '2,$d' /tmp/data.txt
line 3: data B
line 2: data A
line 3: data B
line 4: data C
line 5: footer
line 1: header

패턴 주소

슬래시로 감싼 정규표현식을 주소로 사용합니다. 해당 패턴이 매칭되는 줄에 명령어를 적용합니다.

# "data"가 포함된 줄만 출력sed -n '/data/p' /tmp/data.txt# "data"가 포함된 줄 삭제sed '/data/d' /tmp/data.txt
line 2: data A
line 3: data B
line 4: data C
line 1: header
line 5: footer

범위 주소

시작 주소와 끝 주소를 쉼표로 연결합니다. 줄 번호와 패턴을 섞어서 쓸 수 있습니다.

# "header"가 있는 줄부터 "footer"가 있는 줄까지 출력sed -n '/header/,/footer/p' /tmp/data.txt# 1번 줄부터 "data B"가 있는 줄까지 삭제sed '1,/data B/d' /tmp/data.txt
line 1: header
line 2: data A
line 3: data B
line 4: data C
line 5: footer
line 4: data C
line 5: footer

역참조

s 명령어에서 패턴 안의 그룹을 \1, \2로 참조합니다. 그룹은 \(\)로 묶습니다. BRE(기본 정규표현식)에서는 괄호에 역슬래시가 필요합니다.

# 이름:나이 형식에서 순서를 바꿔 나이:이름으로echo "Alice:30" | sed 's/\(.*\):\(.*\)/\2:\1/'
30:Alice

\1은 첫 번째 그룹(Alice), \2는 두 번째 그룹(30)입니다. 바꿀 내용에서 순서를 뒤집었습니다.

날짜 형식 변환에도 활용합니다.

# YYYY-MM-DD를 DD/MM/YYYY로 변환echo "2024-03-15" | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3\/\2\/\1/'
15/03/2024

& 메타문자

&는 매칭된 전체 텍스트를 의미합니다. 매칭된 내용을 바꾸지 않고 앞뒤에 무언가를 추가할 때 유용합니다.

# 숫자를 대괄호로 감싸기echo "There are 42 items and 7 categories" | sed 's/[0-9][0-9]*/[&]/g'
There are [42] items and [7] categories

[0-9][0-9]*는 한 자리 이상의 숫자를 매칭합니다. [&]는 매칭된 숫자를 대괄호 안에 넣습니다.

실습 1. 로그에서 시간 범위 추출

아파치 로그에서 특정 시간대의 항목만 추출합니다.

cat > /tmp/access.log << 'EOF'192.168.1.1 - - [15/Mar/2024:08:15:22] "GET /index.html" 200192.168.1.2 - - [15/Mar/2024:09:30:11] "GET /about.html" 200192.168.1.3 - - [15/Mar/2024:10:05:44] "POST /api/login" 401192.168.1.4 - - [15/Mar/2024:10:22:33] "GET /dashboard" 200192.168.1.5 - - [15/Mar/2024:11:00:01] "GET /logout" 302EOF# 10시대 로그만 추출sed -n '/\[15\/Mar\/2024:10:/p' /tmp/access.log
192.168.1.3 - - [15/Mar/2024:10:05:44] "POST /api/login" 401
192.168.1.4 - - [15/Mar/2024:10:22:33] "GET /dashboard" 200

슬래시가 포함된 패턴에서 슬래시를 \/로 이스케이프했습니다.

실습 2. 필드 순서 바꾸기

CSV 데이터에서 첫 번째 필드와 두 번째 필드의 순서를 바꿉니다.

cat > /tmp/students.csv << 'EOF'Alice,90,ABob,75,BCarol,88,ADave,62,CEOF# 이름,점수,등급 → 점수,이름,등급sed 's/\([^,]*\),\([^,]*\),\(.*\)/\2,\1,\3/' /tmp/students.csv
90,Alice,A
75,Bob,B
88,Carol,A
62,Dave,C

[^,]*는 쉼표 이외의 문자가 0개 이상 반복되는 패턴으로, 쉼표로 구분된 각 필드를 캡처합니다.

이제 sed의 주요 기능을 모두 살펴봤습니다. 다음 절에서는 이 기능들을 모두 종합해 실전 설정 파일 자동 수정 스크립트를 만들어보겠습니다.