ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] sed 명령어에 대해 알아보자
    IT Study/OS 2026. 1. 26. 12:46

    파일을 직접 열지 않고 파일을 변경할 수 있는 편집기이다. 

    필자는 sed를 처음 써 본 경험이 subroutine과 main stream 파일을 분리할 때 처음 써봤는데, sed가 없었다면 일일이 sndemo*파일에 addpath를 실행해야했지만, sed를 통해 다음과 같은 과제를 수행할 수 있었다. 

     

    - 전체 sndemo* 파일의 3번째 줄에 addpath('/path/...')' 입력하기 

     

    이처럼 텍스트 편집기를 통해 파일을 직접 열지 않고 한번에 삽입, 치환, 삭제 그리고 검색을 할 수 있는 매우 유용한 도구이다.

     

     

    sed Stream EDitor 

    파일을 직접 열지 않고도 텍스트를 검색, 치환, 삭제할 수 있는 강력한 비대화형(noninteractive)편집기이다. 

    배치(Batch) 편집으로 사용자가 화면을 보며 직접 수정하는 vi와 달리 명령어나 스크립트 파일을 통해 자동으로 텍스트를 처리한다. 기본적으로 입력받은 파일의 줄들을 한 줄씩 읽으면서 지정한 규칙에 따라 편집한 뒤 표준 출력으로 내보낸다. 줄 번호나 특정 문자열 패턴을 기준으로 편집할 대상을 골라낼 수 있다. 

     

    sed의 핵심 역할을 정리해보자면 

    • 배치(Batch) 편집: 명령어나 스크립트 파일을 통해 자동으로 텍스트 처리 
    • 줄 단위 처리: 입력받은 파일의 줄들을 한 줄씩 읽어와 표준 출력(화면)으로 내보냄 
    • 선택적 편집: 줄 번호(position)나 특정 문자열 패턴(context)을 기준으로 편집할 대상을 골라냄 

     

    Options 주요 옵션

    • -n(no print): sed는 기본적으로 모든 줄을 화면에 출력하지만 이 옵션을 쓰면 내가 지정한(Print 지시어를 쓴) 줄만 골라서 보여줌 
    • -f program-file: 복잡한 sed 명령어들을 별도의 파일(program-file)에 미리 적어두고, 그 파일에 적힌 대로 작업을 수행 

     

    Format 명령어 형식 

    sed [-n] -f program-file [file-list]
    sed [-n] program [file-list]

    program-file: -f 옵션과 함께 사용하며 복잡한 sed 명령어들을 미리 적어둔 텍스트 파일의 경로 \

    [-n] : 선택사항으로 no print의 줄임말, 기본 출력을 하지 않고 p명령어나 s///p처럼 명시적으로 출력을 요구한 부분만 화면에 보여줌 ! 

    program: -f 옵션을 쓰지 않을 때 터미널에 직접 입력하는 sed명령어 자체(ex. 's/old/new/g')

    file-list: sed가 읽어서 처리할 대상 파일들의 목록, 생략 시 표준 입력(Standard Input)으로부터 데이터를 받음 

     

    기본 작동 원리는 다음과 같은 단계로 처리한다.

    1. 입력 파일에서 한 줄을 읽음 

    2. 지정한 명령어(Program)를 확인

    3. 해당 줄이 명령어의 주소(범위)에 해당하면 작업 수행

    4. 모든 명령을 마칠 때까지 반복하고 다음 줄로 넘어감 

     

    더보기

    sed 명령어 형식은 sed '명령' 파일명이 기본 뼈대라고 생각하면 좋다. 

    또한 -i옵션을 통해 파일을 실제로 바꿀 수 있다. sed 바로 뒤에 붙이면 됨 ! 

     

     

     

    Address 범위 

    편집을 적용할 범위(줄 번호 또는 패턴), 생략 시 모든 줄에 적용 
    • 줄 번호: 3(3행) / 3,6 (3~6행)처럼 지정 
    • 마지막 줄: $기호를 사용 → 파일의 맨 마지막 줄을 의미
    • 정규 표현식: /pattern/ 형식을 사용하여 특정 단어가 포함된 줄만 고름 
    • 부정 연산: address !instruction은 해당 주소가 아닌 줄에 명령을 적용 

     

    Instructions 핵심 명령어 

    가장 많이 쓰이는 편집 명령어 모음 
    명령어 기능 특징
    s substitute 치환 s/기존/바꿀거/g 형식으로 단어 교체 
    d delete 삭제 선택한 줄을 출력하지 않고 삭제
    p print 출력  선택한 줄을 화면에 보여줌, 보통 -n 옵션과 잘 어울림
    a\ append 뒤에 추가 지정한 줄 다음에 새로운 텍스트를 추가
    i\ insert 앞에 삽입 지정한 줄 앞에 새로운 텍스트를 삽입
    c\ change 내용 변경 선택한 줄 전체를 새로운 텍스트로 통째로 바꿈
    n next 다음 줄로 현재 줄 처리를 중단하고 즉시 다음 줄을 읽어옴 
    w write  저장  편집 결과를 별도의 파일로 저장
    r read 읽어오기 다른 파일의 내용을 읽어서 특정 줄 다음에 합침 

     

    Sed 및 정규 표현식(Regex) 특수 기호 정리 

    기호 명칭 상세 설명  예시
    ^ Caret  줄의 시작을 의미  /^%/d : 주석 %로 시작하는 줄 삭제
    $ Dollar  줄의 끝 또는 파일의 마지막 줄을 의미  '$a\END': 파일 맨 끝에 END추가 
    . Dot 임의의 한 글자와 일치(공백 포함) s/p.n/prn/g: p?n을 prn으로 교체
    * Asterisk 앞의 문자가 0번 이상 반복됨 s/PRN[0-9]*/.../ PRN : 뒤 숫자가 몇개든 선택 
    [] Brakets 대괄호 안의 문자 중 하나와 일치 [0-9](모슨 숫자), [a-z] 모든 소문자
    & Ampersnad 방금 찾은 문자열 그대로 가져다 씀  s/sndemo/&_ver1/ : sndemo를 sndemo_ver1로 변경
    Exclamation 부정(Not)의 의미
    해당 조건이 아닌 줄에 적용 
    /^%/!d : 주석이 아닌 줄만 골라 삭제
    \ Backslash 특수 기호를 일반 문자로 취급하거나
    명령을 연결 
    s/\./,/g : 마침표 .를 쉼표, 로 변경 
    / Slash 패턴이나 경로를 구분하는 기본 구분자 s/old/new

     


    sed는 화면 없는 vi라고 불릴 만큼 강력한 명령어 편집기이다. 그런데 vi에도 무궁무진한 쓰임이 있고 sed도 마찬가지라 자주 쓰이는 예제를 통해 학습하는 게 좋을 것 같다 !! 

     

    Examples 예제 

    • 추가
    sed '3i\addpath("/path/");' sndemo*.m

    → 특정 줄(3번째 줄)에 내용 추가 (i) 

     

    ** \역슬래시: sed의 i(insert), a(append), c(change) 명령어는 명령어 바로 뒤에 \를 쓰고, 그 다음 줄에 내용을 적는 것이 정석 ! 

    sed '$a\% End of Simulation' sndemo01.m

    → 마지막 줄에 주석 추가 (a)

     

    • 삭제 (d) 
    sed '/DEBUG/d' simulation.log

    → DEBUG라는 단어가 포함된 모든 줄 삭제 

    sed '/^$/d' data.txt

    → 빈 줄(Empty line) 한꺼번에 삭제 

    ** /^$/ : ^와 $은 각각 줄의 시작과 끝을 의미하므로 줄이 시작되자마자 끝나버리는 지점을 찾는 것이다. 

     

     

    • 치환(s) 
    sed 's/PRN = [0-9]*/PRN = 15/g' sndemo*.m

    → PRN 뒤에 오는 숫자(0-9)를 15로 통일 

    sed 's/^[ \t]*//' script.sh

    → 줄 시작 부분의 공백 제거(들여쓰기 정리) 

    ** /^[ \t]*$: 시작(^)과 끝($)사이에 공백이나 탭이 0개 이상 있는 경우를 찾음 

     

    • 범위 지정해서 편집(Address) 
    sed '10,20s/False/True/g' config.txt

    → 10행부터 20행 사이에서만 'False'를 'True'로 변경 

    sed -n '/START/,/END/p' experiment.log

    → 첫 번째 'START'부터 'END'까지만 출력(-n과 p) 

     

     

    • 재사용: &기호 활용하기 
    echo "Delay:10" | sed 's/[0-9][0-9]*/&ms/'
    Delay:10ms

    →  해당 구문에서는 &기호에 Delay:10이 들어가는 것을 확인할 수 있다. 앞선 결과물을 저장하는 하나의 변수라고 이해하니 외우기 편했음 

     


    sed는 꽤나 외울게 많지만 크게 3가지 흐름만 기억하면 된다. 

     

    1. 어디를 ? - Address: 줄 번호(3)나 패턴(/^$/)으로 범위를 지정

    2. 무엇을? - Instruction: 바꿀지(s), 지울지(d), 넣을지(i) 지정

    3. 어떻게? - Flag: 전체를 바꿀지(g), 파일에 직접 저장할지(-i) 정함 

     

     

Designed by Tistory.