쉘 스크립트 - 6

2021. 7. 28. 21:12

sed
 - 입력 스트림(입력파일)에서 텍스트변환을 수행하는 스트림편집기
 - vi와 같은 문서편집기가 나오기 이전에 사용되던 명령어
 - 문서 편집기 사용없이 sed 명령어로 문서를 편집할 수 있으며, 스크립트가 제공된다
 - 실제 문서에는 영향을 끼치지 않는다
 - 상세개념: https://jhnyang.tistory.com/287


 - 사용법
    : sed [옵션] '어드레스 {명령어}' 대상파일
    : sed [옵션] -f 스크립트 대상파일
    : 명령어 | sed [옵션] '{스크립트}'

 - 어드레스: 대상파일의 내부의 주소, 대상파일에서의 어떤 범위를 의미
      number : 라인번호에서 명령어 실행
      number~step : 라인번호 기준 step번째 이후 줄마다 명령어 실행
      $ : 파일의 마지막라인을 의미
      /정규표현식/ : 정규표현식과 일치하는 라인에서 명령어 수행
      \c정규표현식c : /정규표현식/과 동일
      0,addr2 : 첫 라인부터 addr2라인까지 명령어 수행(addr2은 정규표현식)
      addr1,+N : addr1  라인부터 +N라인까지 명령어 수행(즉 addr1~addr1+N line, addr1은 정규표현식)
      addr1,~N : addr1  라인부터 N라인까지 명령어 수행(즉 addr1~N line, addr1은 정규표현식)

 - 명령어
    : 어드레스가 필요없는 명령어(라벨, 수석, 블록), 단일 어드레스를 사용하는 명령어(문자열 추가, 삽입, 스크립트 종료, 파일내용추가), 어드레스 범위를 사용하는 명령어(문자열 변경, 삭제, 출력, 라벨분기)로 나뉜다

      0 or 1 어드레스 명령어(어드레스가 필요없는 명령어, 단일 어드레스를 사용하는 명령어)
        :label : 라벨
        #comment : 주석
        {...} : 블록
        = : 라인번호 출력
        a \문자열 : 문자열(을 뒤에) 추가(\까지만 입력후 엔터, 그 후 문자열입력 후 엔터 이후 명령어와 대상파일 입력)
        i \문자열 : 문자열(을 해당라인 앞에) 삽입
        q : sed 스크립트 종료
        Q : sed 스크립트 종료
        r 파일명 : 조건을 만족하는 라인 다음라인부터 파일내용 추가(파일명 이후 엔터, 이후 명령어와 대상파일 입력)
        R 파일명 : 'r 파일명'과 동일하지만 해당파일의 첫라인만 명령어 대상파일에 추가


      어드레스 범위 명령어
        b 라벨 : 스크립트 실행시 해당 명령어가 실행되면 라벨이 적힌 부분으로 분기함
        c \문자열 : sed 명령 대상이 되는 라인을 문자열로 변경
        d D 
         : 대상 어드레스에서 해당하는 문자열이 있는 라인을 삭제한다. 
           d는 해당라인에 개행이 있어도 해당라인 전체내용을 삭제
           D는 해당라인에 개행있을 경우 개행까지만 삭제
        h : 패턴 버퍼의 내용을 홀드 버퍼로 복사
        H : 패턴 버퍼의 내용을 홀드 버퍼로 이어 붙임(추가)
        g : 홀드 버퍼의 내용을 패턴 버퍼로 복사하는 명령어
        G : 홀드 버퍼의 내용을 패턴 버퍼로 이어 붙임(추가)
        l : 대상 라인을 출력, p와의 차이점은 문자의 끝을 알리는 $기호 같은 특수기호를 같이 출력한다
        l width : 대상 라인의 너비를 입력한 'width'의 크기로 출력한다. 대상라인이 'width'이상이면 다음라인에 이어 출력한다
        n N
         : n와 N명령어는 입력된 라인의 다음라인을 복사하는 명령어
        p P 
         : p와 P명령어는 출력(print) 명령어이다.
           p는 패턴공간 내용을 그대로 출력
           P는 p와 동일하되, 개행이 있는 라인은 개행까지만 출력(ex: aasd\njkl -> aasd까지만 출력)
        s/정규표현식/replacement/ : 정규표현식과 일치하는 문자열을 replacement로 변경한다
        t label : 앞에 오는 어드레스가 참이든 거짓이든 분기
        T label : 앞에오는 어드레스가 참이 아닌 거짓일 경우에만 분기, 참일 경우 분기없이 명령어를 이어서 수행
        x : 패턴버퍼와 홀드버퍼의 내용을 서로 변경한다
        y/source/dest/ : 대상 파일에서 source라 명시된 문자열을 dest문자열로 변경
    ** 패턴버퍼와 홀드버퍼
        sed 명령어 수행시 사용하는 2개의 버퍼이다.
        패턴버퍼는 대상파일의 내용을 한줄씩 읽어 저장하는, 현재의 정보(현재의 라인)를 저장하기 위한 임시 버퍼이다.
        홀드버퍼는 대상 파일의 라인 수 만큼 저장할 수 있는 공간을 가지는 버퍼이다. sed명령어 실행 중 예전 라인을 다시 불러와서 재사용하는 용도로 사용할 수 있다.

 - 옵션
    -n : 패턴 버퍼를 출력하지 않음
    -f 스크립트 : 스크립트파일 실행옵션
    -e 스크립트 : 여러개의 스크립트를 실행시 사용(2개 실행시 '-e 스크립트 -e 스크립트'와 같은 꼴로 사용)
    -i 파일확장자 : sed명령어 실행결과를 대상 파일에 반영, 대상 파일이 심볼릭링크일 경우 해당 심볼릭링크파일의 내용이 바뀌어 새로운 파일로 변경된다(타겟파일의 내용은 변경되지 않음)
    --follow-symlinks : -i옵션과 같이 사용. 대상파일이 심볼릭링크일때 심볼릭링크의 타겟파일에 sed명령어 실행결과를 반영한다
    -c : -i옵션과 같이 사용. 파일명 뒤에 c가 붙은 (원본파일의 내용이 들어있는) 백업파일을 생성
    --posix : POSIX 확장기능을 사용하지 않음
    -r : POSIX 확장 정규식 사용
    -s : 여러개의 파일을 각각의 파일 단위로 명령어를 처리(정확히는 여러파일을 1개의 패턴공간이 아닌 n개의(개별 파일의) 패턴공간에 파일내용을 읽어 저장한다)
    -z : 개행을 \n이 아닌 null로 지정되어있는 문자열 편집시 사용
    --help : 도움말
    --version : 버전정보

'Study > Shell' 카테고리의 다른 글

쉘 스크립트 - 후기  (0) 2021.07.29
쉘 스크립트 - 7  (0) 2021.07.29
쉘 스크립트 - 5  (0) 2021.07.23
쉘 스크립트 - 4  (0) 2021.07.19
쉘 스크립트 - 3  (0) 2021.06.23

+ Recent posts