최근 수정 시각 : 2024-01-22 17:29:11

sed(UNIX)

1. 개요2. 설명3. 옵션4. 스크립트
4.1. 주소 지정4.2. 명령어
5. 사이클
5.1. 패턴 공간(pattern space)5.2. 홀드 공간(hold space)
6. 관련 문서

1. 개요

sed, stream editor

유닉스 시스템에서 문자 스트림의 내용을 수정하고 편집하여 내보낼 수 있게 하는 유틸리티 중에 하나이다.

2. 설명

sed는 단독으로도 사용되고 실제로 어느정도 편집기의 역할을 할 수 있지만 주로 명령어 파이프 사이에서 사용되는데, 어떤 명령어의 출력을 가공하여 다른 명령어의 입력으로 넣는 것이다. 명령어 출력의 특정 부분만을 필요로 하거나, 쓸데없는 부분이 많다면 규칙에 따라 유용한 문자열만 추출하도록 하는 필터의 역할을 한다.

VLC를 root 계정으로 실행할때도 이 명령어를 사용한다.
sudo sed -i 's/geteuid/getppid/' /usr/bin/vlc

3. 옵션

기본 형식 : sed [efn] script file, script는 sed에서 사용하는 스크립트를 지정한다. 처리할 문자 스트림이 표준 입력으로 들어오지 않는 경우, file에 해당하는 파일을 대신 사용한다.
  • -e script : script를 sed의 스크립트로 사용한다. 명시하지 않아도 인자의 첫번째는 스크립트를 나타낸다는 사실을 알지만 이 옵션을 사용하면 스크립트 여러개를 지정해줄 수 있다.
  • -f script_file : script_file에 해당하는 파일을 스크립트로 사용한다. 사용 용법은 -e와 비슷하지만 스크립트가 인자 대신 파일 이름으로 전달된다는 것이 다르다.
  • -n : 기본 출력을 표시하지 않는다. sed의 기본 동작은 명령어 끝에 도달했을때 자동으로 패턴 공간의 내용을 출력하는데 이 옵션이 사용되었을 경우 p 명령어 등으로 명시해야만 편집된 결과물을 출력한다.

4. 스크립트

4.1. 주소 지정

주소 지정은 입력의 몇번째 줄을 대상으로 처리할지를 나타낸다. 명령어 별로 사용하는 범위가 다르기 때문에 보통 3가지의 주소 지정 모드를 가진다. ed에서 쓰이는 것과 비슷하고 실제로 일부는 호환이 가능하지만 확장 기능에서 몇가지 차이가 있어 완벽하게 호환되지 않는다.
  • 0개 주소 : 주소가 필요없다는 의미이다. 레이블을 지정하는 명령어 :의 경우, 주소가 필요하지 않다.
  • 1개 주소 : 명령어 앞에 한 개의 줄 번호가 필요하다.
  • 2개 주소 : 명령어 앞에 콤마(,)로 구분된 두개의 줄 번호가 필요하며 주로 특정 범위를 다루는 명령어에서 쓰인다. 많은 명령어들은 이보다 부족한 주소 개수에서도 작동하는데 범위 대상이 아닌 특정 줄을 대상으로 하거나, 전체 줄을 대상으로 하는 경우이다.

$는 마지막 줄을 나타내는 특수 기호이다. !는 패턴 공간에 대한 주소가 아닌 경우, 그대로 실행한다.

4.2. 명령어

대부분의 명령어는 ed 유틸리티와 호환성이 있지만 흔적만 남고 줄 단위 편집기와 관련 없거나 sed 동작에 맞지 않는 명령어는 없어졌다.
  • a\
    text : 문자열을 출력한다.
  • b label : 지정한 레이블로 이동한다.
  • c\
    text : 줄을 바꾼다.
  • d : 패턴 공간을 삭제하고 새로운 사이클을 시작한다.
  • D : 패턴 공간에 개행 문자가 포함되어 있지 않을때 d와 같지만, 아니라면 패턴 공간의 첫 줄만 삭제하고 패턴 공간의 내용을 유지한채로 새로운 사이클을 시작한다. 매 사이클의 시작은 개행 문자가 포함되지 않은 한 줄을 입력받기 때문에 일반적인 상황에서는 두 명령어의 동작 차이는 발생하지 않지만, 일부 명령어는 입력을 새로 읽거나 개행 문자를 삽입하기도 하므로 동작이 달라질 수 있다.
  • g, G : 홀드 공간의 문자열을 패턴 공간으로 덮어쓰기/덧붙히기 한다.
  • h, H : 패턴 공간의 문자열을 홀드 공간으로 덮어쓰기/덧붙히기 한다.
  • i\
    text : 표준 출력에 문자열을 쓴다.
  • l : 제어 문자, 특수 문자 등의 화면에 보이지 않는 문자들을 이스케이프 문자들로 출력한다.

아래의 두 명령어 모두 공통 동작으로 더이상 읽어올 줄이 없는 경우, 스크립트의 끝으로 이동한다는 특징이 있다.
  • n : 패턴 공간의 내용을 표준 출력에 쓰고 새로운 사이클을 시작한다.
  • N : 한 줄을 새로 읽어 현재 패턴 공간에 다음 줄에 덧붙힌다. 이 과정에서 이전 줄과 다음 줄 사이에 개행 문자가 삽입된다.
  • p : 패턴 공간의 내용을 출력한다.
  • P : p와 비슷하지만 패턴 공간이 여러줄인 경우 첫번째 줄만 출력한다. 패턴 공간의 내용은 변경되지 않는다.
  • q : 스크립트를 종료한다.
  • s/ BRE/바꿀 내용/옵션 : 정규 표현식에 해당하는 부분을 찾고 그 부분을 바꾼다. 하위 표현식으로 찾은 부분은 바꿀 내용에서 참조를 통해 치환할 수 있다. 주의할 점은 바꿀 내용에서는 하위 표현식 참조를 제외하고는 정규 표현식 문법이 작동하지 않고 하위 표현식을 작성할때는 괄호가 특수 문자 취급을 받으므로 역슬래시 문자로 이스케이프를 해야한다. 옵션은 n, g, p, w 등이 있다. 한 줄에서 여러번 치환 작용을 하려면 g 옵션을 붙혀야 한다.
  • t [LABEL] : 가장 최근에 치환 작업이 성공하거나 t 명령어가 작동했을 경우, LABEL에 해당하는 스크립트 위치로 이동한다. t 명령어와 레이블 사이에 공백이 요구되는 것은 아니다.
  • w wfile : 현재 패턴 공간의 내용을 wfile의 파일 이름으로 저장한다. 원본 파일의 내용은 그대로 유지하고 그 다음 줄에 덧붙혀진다.
  • x : 패턴 공간과 홀드 공간의 내용을 교환한다.
  • y/string1/string2/ : string1의 내용을 찾고 string2로 바꾼다.
  • :LABEL : LABEL의 이름으로 레이블을 생성한다. 이는 나중에 b, t등 분기 명령어의 이동 위치를 지정하는데 쓰인다. ed의 마킹과는 다르게 사용시 접두사를 필요로 하지 않고, 알파벳 대소문자 하나만 사용해야 하는 것도 아니기 때문에 개수 제한도 없다.
  • = : 현재 줄 번호를 표준 출력에 쓴다.
  • # : 주석과 비슷하게 줄 끝까지 모든 문자를 무시한다.

5. 사이클

sed는 사이클이라는 단계로 동작을 구분한다. 매번 하나의 단계마다 입력으로부터 한 줄을 읽어 패턴 공간에 저장한다. 이 문자열은 줄 끝에 개행 문자가 포함되어있지 않다.

5.1. 패턴 공간(pattern space)

명령어의 실행 대상이 되는 공간이다. 즉, sed는 실제 파일을 편집하지 않는다. 패턴 공간은 사이클마다 초기화되는데 그 이유는 사이클의 시작 조건부터가 한 줄을 입력받는 공통 동작이 있기 때문이다.

5.2. 홀드 공간(hold space)

비휘발성 저장소와 비슷한 역할을 한다. 새로운 사이클이 시작되어도 초기화되지 않고 이전 데이터를 유지한다.

6. 관련 문서

  • awk : CSV처럼 문자로 구분된 필드와 줄 단위의 레코드를 다룰 수 있는 유틸리티. sed와는 다르게 프로그래밍 언어에 좀 더 가깝다.
  • UNIX
  • 정규 표현식