sed는 비대화형(non-interactive) 모드의 줄 단위 편집기입니다. 표준입력이나 파일에서 텍스트를 입력으로 받아, 주어진 줄들에 대해 한 번에 한 줄씩 어떤 처리를 한 다음 그 결과를 표준출력이나 파일로 내 보냅니다. sed는 쉘 스크립트에서 파이프에 걸어 쓸 수 있는 몇몇 도구중 하나입니다.
sed는 주어진 주소 범위(address range)에서 의해 입력의 어떤 줄을 조작할 것인지를 결정합니다. [1] 이 주소 범위는 줄 번호로 주어질 수도 있고 일치하는 패턴으로 주어질 수도 있습니다. 예를 들면, 3d는 입력의 3번째 줄을 지우라는 신호이고 /windows/d는 "windows"를 포함하는 모든 줄을 지우라는 뜻입니다.
sed가 할 수 있는 일 가운데, 일반적으로 가장 많이 쓰이는 printing(표준출력으로 출력), deletion(삭제), substitution(치환), 이 세 가지를 살펴보겠습니다.
표 B-1. 기본 sed 연산자
연산자 | 이름 | 뜻 |
---|---|---|
[주소-범위]/p | [주어진 주소 범위] 출력 | |
[주소-범위]/d | delete | [주어진 주소 범위] 삭제 |
s/pattern1/pattern2/ | substitute | 한 줄에서 처음 나타나는 pattern1을 pattern2로 치환 |
[주소-범위]/s/pattern1/pattern2/ | substitute | 주소-범위에 대해서 한 줄에 처음 나타나는 patter1을 pattern2로 치환 |
[주소-범위]/y/pattern1/pattern2/ | transform | 주소-범위에 대해서 pattern1에 나타나는 어떤 문자라도 pattern2에 나타나는 문자로 바꿈(tr과 동일) |
g | global | 입력의 일치하는 각 줄에서 발생하는 모든 패턴에 대해 동작 |
참고: 치환(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가 어떻게 쓰이는지를 보려면 다음을 참고하세요.
sed의 더욱 다양한 쓰임새를 알고 싶다면 서지사항에서 적당한 참고 자료를 찾아서 확인해 보기 바랍니다.
[1] | 주소 범위가 주어지지 않는다면 디폴트로 모든 줄을 처리합니다. |