본문 바로가기
클라우드 아키텍트 양성과정

쉘 프로그래밍 sed(Stream Editor)

by 종바깅 2021. 5. 12.

sed(Stream Editor)

vi, gedit, nano : file editor

sed : stream editor

  • sed 특징

    • interactive기능이 없는 에디터 : 비대화형 에디터
    • 파일을 수정하여도 수정내용이 반영되지 않음, -i 옵션 사용시 파일에 저장
    • 쉘 프로그래밍에서 많이 사용
    • line 단위의 처리
    • vi 편집기외 유사한 부분이 있음
  • pattern space

    • sed는 텍스트를 라인 단위로 처리
    • 처리를 하기 위해 텍스트 데이터를 가져와서 가공하는 공간
    • 처리가 끝난 텍스트 데이터는 화면으로 출력
  • sed 실행 형식

    • sed [옵션] '명령어 대상' : 특정 범위를 지정하지 않고 전체 라인에 적용

    • sed [옵션]'패턴 명령어' 대상

    • sed [옵션]'범위 명령어' 대상

      • 범위 : 라인 수(어드레스)

        • $ : 주소부분에 사용시 마지막 줄을 의미
      • 범위 지정시 [시작주소],[마지막주소] 형식으로 사용

        • 주소,주소

        • /패턴/,/패턴/

        • /패턴/,주소

        • 주소,/패턴/

  • sed 명령어

    • -p : print 출력
      • !p : 패턴에 해당되지 않는 라인 출력
    • -d : delete 삭제
    • -s : substitute 교체, 텍스트 데이터 바꾸기, vi 편집기에서 사용하는 방식과 동일
      • s/찾을패턴/바꿀내용/: 라인에서 첫번째 확인된 패턴만 교체
      • s/찾을패턴/바꿀내용/g
    • -q : quit 종료
  • sed 명령어 옵션

    • -n : 패턴스페이스에서 처리한 라인의 기본 출력을 억제, 보통 p와 함께 사용

    • -e : 다중 편집 실행

    • -f : 스크립트 형태로 편집할 내용을 불러오기

sed 기본 연습(datafile)

1, north 패턴을 가지고 있는 라인만 출력
2, west 패턴을 가지고 있는 라인부터 east 패턴을 가지고 있는 라인까지 출력
3, 5번줄부터 northeast 패턴이 있는 라인까지 출력
4, north 패턴이 없는 라인을 출력
  • sed 편집 명령어

    • -a : 대상 아랫줄에 라인 추가, 여러 줄을 한꺼번에 추가할 수 있음

    • -i : 대상 윗줄에 라인 추가, 여러 줄을 한꺼번에 추가할 수 있음

      • 라인 안의 내용을 삽입하기 위해서는 a,i 명령 대신 a 명령으로 처리

        s/[3-5]/&hello/ : [3-5]패턴을 찾아서 해당 패턴 위치 뒤에 hello 삽입

    • -c : change, 지정된 라인을 변경

    • -r : 파일에 있는 내용을 읽어와서 a형태로 추가

    • -w : 파일에 기록

      • 단 읽어올 파일과 기록할 파일이 같을 경우 정상적으로 동작하지 않음

        ex) sed '3,5w test.txt' test.txt → test.txt 파일이 빈 파일로 변경됨

      • 중간 파일을 만들어 기록하 덮어쓰기로 변경

        sed '3,5w test2.txt' test.txt

        cp test2.txt test.txt

  • 다중 편집 (-e)

    • sed를 사용한 편집을 한 명령어로 수행
    • -e [실행할 내용1] -e [실행할 내용 2]...
      • 실행할 내용1을 전부 수행한 후 실행할 내용 2를 수행
      • 앞단계의 실행 내용이 뒷 단계의 실행내용에 영향을 줄 수 있음

스크립트 실행(-f)

  • 스크립트에 포함하는 내용 : ' '내부에 들어가는 내용

  • 여러 명령을 한꺼번에 집어넣기 가능

  • 스크립트 내부에 내용 작성시 ' '기호는 제외

  • 스크립트 끝 부분에 불필요한 공백이 있을 경우 에러가 발생할 수 있음

  • 한 줄에 여러 명령어를 함께 사용할 수 있음(;기호 사용)

  • 주석 사용가능 : # 기호가 맨 앞에 있을 경우 주석으로 처리됨

      [root@server1 ~]# cat > sedscript
      #this is sed script sample
      1i\
      This is Number List\
      ==================
      1,3 s/[0-9]/&hello/
      5c\
      merong
      $a\
      =================
      [root@server1 ~]# sed -f sedscript number.txt
      This is Number List
      ==================
      1hello
      2hello
      3hello
      4
      merong
      6
      7
      8
      9
      10
      =================

sed 종합 실습

1.  Jon의 이름을 Jonathan으로 교체하세요
# sed -n 's/^Jon/Jonathan' databook // 바꾸기만 할 때
# sed -n 's/^Jon/Jonathan/p' databook // 바꾸고 출력

2. 처음 세 행을 삭제 하시오
# sed '1,3d' databook

3. Lane이 포함된 행을 삭제하시오
# sed '/Lane/d' databook

4. 생일이 11월이나 12월인 사람들의 행을 출력하시오
# sed -n '/:1[12]\/[0-9]' databook

5. Fred로 시작하는 행의 끝에 세 개의 별표(*)를 붙이시오
# sed -n '/Fred/ s/.*$/&***/p' databook

6. Popeye의 생일을 11/14/46으로 교체하시오
# sed -n /Popeye/ 's/3\/19\/35/11\/14\/46/p' databook
# sed -r -n '/Popeye/ s/:1?[0-9]\/[123]?[0-9]\/[0-9][0-9]:/:11\/14\/46:/p' databook

7. 빈행을 삭제하시오
# sed '/^$/d' databook
# sed '/^[[:space:]]*$/d' databook

8. 아래와 같이 수정하는 sed 스크립트를 작성하시오
    첫 줄에 Personal File  제목 삽입
    San Francisco에 거주하는 사람을 제거        
    마지막 줄에 THE END 추가

# sed script sample
1i\
Personal File
/San Francisco/d
$a\
The End

#sed -f sample databook

댓글