B.1. Sed

sed는 비대화형(non-interactive) 모드의 줄 단위 편집기입니다. 표준입력이나 파일에서 텍스트를 입력으로 받아, 주어진 줄들에 대해 한 번에 한 줄씩 어떤 처리를 한 다음 그 결과를 표준출력이나 파일로 내 보냅니다. sed는 쉘 스크립트에서 파이프에 걸어 쓸 수 있는 몇몇 도구중 하나입니다.

sed는 주어진 주소 범위(address range)에서 의해 입력의 어떤 줄을 조작할 것인지를 결정합니다. [1] 이 주소 범위는 줄 번호로 주어질 수도 있고 일치하는 패턴으로 주어질 수도 있습니다. 예를 들면, 3d는 입력의 3번째 줄을 지우라는 신호이고 /windows/d"windows"를 포함하는 모든 줄을 지우라는 뜻입니다.

sed가 할 수 있는 일 가운데, 일반적으로 가장 많이 쓰이는 printing(표준출력으로 출력), deletion(삭제), substitution(치환), 이 세 가지를 살펴보겠습니다.

표 B-1. 기본 sed 연산자

연산자이름
[주소-범위]/pprint[주어진 주소 범위] 출력
[주소-범위]/ddelete[주어진 주소 범위] 삭제
s/pattern1/pattern2/substitute한 줄에서 처음 나타나는 pattern1을 pattern2로 치환
[주소-범위]/s/pattern1/pattern2/substitute주소-범위에 대해서 한 줄에 처음 나타나는 patter1을 pattern2로 치환
[주소-범위]/y/pattern1/pattern2/transform주소-범위에 대해서 pattern1에 나타나는 어떤 문자라도 pattern2에 나타나는 문자로 바꿈(tr과 동일)
gglobal입력의 일치하는 각 줄에서 발생하는 모든 패턴에 대해 동작

참고: 치환(substitute) 명령어에 g(global) 연산자를 같이 안 쓰면 한 줄에 패턴이 여러번 일치하더라도 오직 첫 번째 패턴만 치환됩니다.

명령어 줄이나 쉘 스크립트에서 sed를 쓸 때는 쿼우팅과 몇몇 옵션이 필요할 지도 모릅니다.

sed -e '/^$/d'
# -e 옵션은 다음에 나오는 문자열을 편집 명령어로 해석하게 합니다.
# ("sed"에 단 하나의 명령을 내린다면 "-e"는 넣어도 되고 안 넣어도 됩니다.)
# "강한" 쿼우트('')는 sed 명령에 나오는 정규 표현식용 문자가
# 쉘에 의해 특수 문자로 재해석 되는 것을 막아줍니다.
# (이렇게 해서 sed가 명령어의 정규 표현식을 확장하도록 해 줍니다.)

참고: sed, awk 모두, -e 옵션을 써서 다음에 나오는 문자열이 명령이나 명령 집합이라는 것을 지정해 줍니다. 만약에 문자열이 그냥 하나짜리 명령이라면, 이 옵션은 안 적어줘도 됩니다.

sed -n '/xzy/p'
# -n 옵션은 패턴이 일치하는 줄만 출력하도록 합니다.
# 이 옵션이 없으면 모든 입력이 출력됩니다.
# 여기서는 단지 한 개의 편집 명령만 쓰기 때문에 -e 옵션은 필요없습니다.

표 B-2. 예제

표시
8d입력의 8번째 줄을 지워라.
/^$/d빈 줄을 모두 지워라.
1,/^$/d첫 줄부터 처음 나타나는 빈 줄까지 지워라.
/Jones/p"Jones"를 포함하는 줄만 출력하라(-n 옵션을 써서).
s/Windows/Linux/입력의 각 줄에서 처음 나오는 "Windows""Linux"로 치환하라.
s/BSOD/stability/g입력의 각 줄에서 "BSOD"가 나올 때 마다 "stability"로 치환하라.
s/ *$//모든 줄의 끝에 나오는 빈 칸을 지워라.
s/00*/0/g연속적인 모든 0을 하나의 0으로 압축하라.
/GUI/d"GUI"를 포함하는 모든 줄을 지워라.
s/GUI//g"GUI"가 나오는 줄에서 "GUI"만 지워라.

참고: 어떤 단어를 길이가 0인 문자열로 치환하는 것은 그 줄에서 그 단어만 지우는 것과 똑같습니다. 이렇게 하면 그 줄의 나머지 부분들은 아무 영향도 받지 않습니다. 어느 어플리케이션이나 가장 중요한 부분은 GUI와 음향 효과이다.라는 줄에 s/GUI//을 걸면
어느 어플리케이션이나 가장 중요한 부분은  와 음향 효과이다.
라고 됩니다.

작은 정보: 텍스트 파일의 매 줄마다 빈 줄을 넣을 때는 sed G filename이라고 하면 아주 간단합니다.

쉘 스크립트에서 sed가 어떻게 쓰이는지를 보려면 다음을 참고하세요.

  1. 예 34-1

  2. 예 34-2

  3. 예 12-2

  4. 예 A-3

  5. 예 12-12

  6. 예 12-20

  7. 예 A-7

  8. 예 A-12

  9. 예 12-24

  10. 예 10-8

  11. 예 12-29

  12. 예 A-2

  13. 예 12-10

  14. 예 12-9

sed의 더욱 다양한 쓰임새를 알고 싶다면 서지사항에서 적당한 참고 자료를 찾아서 확인해 보기 바랍니다.

주석

[1]

주소 범위가 주어지지 않는다면 디폴트로 모든 줄을 처리합니다.