SED(Stream Editor) 명령어
- sed명령어는 원본 텍스트 파일을 편집하는 유용한 명령어이다. vi편집기와 유사하다.
- sed와 vi편집기의 다른 점은 sed는 명령어 형태로 편집이 가능하며 vi처럼 편집기를 열어서 서로 소통하듯 수정/변경을 해나가는 대화형 방식이 아니다.
- sed는 명령행에서 파일을 인자로 받아 명령어를 통하여 작업한 후 결과를 화면으로 확인하는 방식이다. 즉 편집기를 명령어 쓰듯 사용하는 방식을 말한다.
- 즉, 원본은 건드리지 않고 편집하기 때문에 작업이 완료되면 원본에는 전혀 영향이 없다는 점이다. 만일 해당 명령어를 사용하게 되면 내부적으로 특수한 저장 공간인 Buffer를 사용한다.
- Sed명령어는 Streamlined editor를 의미한다. Streamlined는 '능률적인'을 의미한다.
- Buffer에는 2가지 종류가 존재한다.
1. Partten Buffer : 패턴 스페이스라고도 한다.
2. Hold Buffer : 홀드 스페이스라고도 한다.
- sed옵션에서 -i 옵션을 사용할 경우 원본을 바꿀수 있게 된다.
Hold, Parttern Space
패턴 버퍼(스페이스)
- sed가 파일을 라인단위로 읽을 때 그 읽은 라인이 저장되는 임시 공간이다.
- 만일 sed명령어로 출력하라고 지시할 경우 이 Parttern Space의 내용을 출력하는 것이고, 만일 조작을 한다면 Parttern Space의 내용을 조작하는 것이다.
- 원본의 데이터를 불러들여 Parttern Space에 저장을 하고 원본의 데이터를 건들지 않고 이 Parttern Space의 내용을 변경하여 출력하게 된다.
홀드 버퍼(스페이스)
- Hold Space는 Parttern Space처럼 짧은 순간 임시 버퍼를 저장하는것이 아닌 길게 저장하고 있는 저장소이다. 전에 작업하였던 라인을 기억하고 있을 수 있다.
- 어떠한 내용을 Hold Space에 저장하면, sed가 다음 행을 읽더라도 사용자가 원할 때 불러와서 재사용할 수 있는 버퍼를 Hold Space라고 한다.
SED의 옵션
1. sed -n 옵션
특정 범위만큼 출력하기
- sed -n '1p' XXX : XXX파일에서 첫 번째 행만 출력하여 화면에 보여준다.
- sed -n '1, 3p' XXX : XXX파일에서 1~3Line 범위의 내용을 출력하여 보여준다.
- sed -n '8, $p' XXX : XXX파일에서 8Line~마지막Line까지의 범위의 내용을 출력하여 보여준다.
-n |
n옵션은 sed의 parttern Space에 있는 내용을 출력한다. |
p |
P는 Print의 약자로 ,(컴마)를 이용하여 범위를 지정할 수 있다. |
2. sed -e옵션
-e |
여러개의 편집 명령을 실행시킬 때 -e 옵션을 쓴다. |
- 서로 떨어져 있는 데이터를 sed명령어로 출력하기 위해서는 다음과 같이 사용하면 된다.
sed -n -e '1p' -e '45,$p' XXX
sed -e옵션
3. 특정 단어로 시작하는 행들 추출하기
특정 문자열 추출
- 특정 문자열을 추출하기 위해서는 "/원하는 문자열/"를 입력해주면 된다.
- 특정 문자열로 시작하는 단어를 추출하기 위해서는 다음과 같이 입력하면 된다 "/^원하는 문자열/"
- 여기서 ^는 메타문자로 "시작"을 의미한다.
4. 파일에서 공백 및 빈줄 제거하기
sed 명령으로 빈 Line 제거하기
- 메타문자 ^(시작), $(끝)을 알리는 문자로 행의처음과 행의끝을 의미한다.
- d옵션은 delete의 약자로 삭제를 의미한다.
- 위의 문자를 해석하면 행의 처음과 행의 끝에서 빈 Line들을 지우고 내용을 출력해주라는 것을 의미한다.
빈 Line제거 후 새파일로 저장하기
- 위의 명령어를 수행하게 되면 빈 Line을 제거하고 Redirection으로 test02라는 파일로 저장하라는 것을 의미한다.
*메타문자의 의미
- *는 메타문자로 앞의 문자를 0개 이상 찾는다.
- 행의 시작이 0개 이상의 공백으로 이뤄지다 끝을 맺는것이기 때문에 공백이거나 빈 Line을 찾아낸다는 의미한다.
5. 단어 치환
s와 g의 의미
- 파일의 특정 문자열을 원하는 문자로 치환하기 위해서는 s 플래그를 사용하면 된다. s는 Substitution으로 치환을 의미한다.
- g 플래그는 치환이 행에서 전체를 대상으로 이루어진다는 것을 의미한다. sed명령어는 Line단위로 이루어지기 때문에 g플래그를 사용할 경우 전체 Line에 대해서 수행한다는 것을 의미한다.
- 위의 명령어는 파일의 전체에서 "sed"로 시작하는 문자열을 "substitution" 문자열으로 변경시킨다는 것을 의미한다.
대소문자 구분없이 사용 플래그 i
- 위에서는 sed로 시작하는 문자열을 Substitution으로 치환한 후 test02파일에 저장했다.
- i플래그를 사용하여 소문자 substitution으로 시작하는 문자열을 찾았지만 test02파일에는 대문자로 저장되어 있다.
- 이 구분을 무시하기 위해서 i플래그를 사용하여 해당 문자열을 검색 후 sed문자열로 변경하는 사진이다.
- 즉 i플래그는 변경 대상 단어를 찾을 때 대소문자를 무시한다는 플래그이다.
6. SED의 나머지 명령어
나머지 명령어 |
내용 |
a\ |
현재 행에 하나 이상의 새로운 행을 추가한다. |
c\ |
현재 행의 내용을 새로운 내용으로 교체한다. |
d |
행을 삭제한다. |
i\ |
현재 행의 위에 텍스트를 삽입한다. |
h |
Parttern Space의 내용을 Hold Space에 복사한다. |
H |
Parttern Space의 내용을 Hold Space에 추가한다. |
g |
Hold Space의 내용을 Parttern Space에 복사한다. (패턴 스페이스가 비어있지 않은 경우에는 덮어쓰기) |
G |
Hold Space의 내용을 Parttern Space에 복사한다. (패턴 스페이스가 비어있지 않을 경우 그 뒤에 추가) |
I |
출력되지 않는 특수문자를 명확하게 출력한다. |
p |
행을 출력한다. |
n |
다음 입력 행을 첫 번째 명령어가 아닌 다음 명령어에서 처리하게 한다. |
q |
sed를 종료한다. |
r |
파일로부터 행을 읽어온다. |
! |
선택된 행을 제외한 나머지 전체 행에 명령어를 적용한다. |
s |
문자열을 치환한다. |
6-1. sed의 s옵션과 같이 쓰이는 치환 플래그
S와 쓰이는 플래그 |
내용 |
g |
치환이 행 전체에 대해서 이루어진다. |
p |
행을 출력한다. |
w |
파일에 쓴다. |
x |
Hold Space와 Parttern Space의 내용을 서로 맞바꾼다. |
y |
한 문자를 다른 문자로 변환한다. 하지만 메타문자를 사용할 순 없음. |
기타
다픈파일로부터 읽어서 추가하는 명령어(r)
r명령어로 특정 파일의 내용 추가하는 방법
- 위 sed '/Hello/r addfile' test03이라는 명령어는 다음과 같이 해석할 수 있다.
- test03파일에서 Hello라는 특정 문자열을 찾아 읽은 후 addfile이라는 파일에 있는 Line을 삽입하라.
- 따라서 해당 명령어 수행시 Hello Line뒤에 addfile의 내용이 추가된 것을 확인할 수 있다.
다른 파일에다가 쓰는 명령어(w)
파일의 특정 내용을 다른파일에 쓰기
- 위의 sed -n '/Hello/w test02' test01이라는 명령어는 다음과 같이 해석할 수 있다.
- test01의 Hello로 시작하는 Line을 읽어서 해당 라인을 test02라는 파일로 저장하라
수정할 파일에 내용 추가하기 명령어(a\)
\a로 특정 문자열 담긴 Line추가하기
- ^시작문자열이 Hello로 시작하는 Line을 찾아서 a\명령어를 사용하여 특정문자열을 추가하는 명령어
Parttern Space 및 Hold Space 활용하기
sed의 Hold Space 및 Parttern Space 활용하기
- 위의 명령어는 test02파일에서 Hello라는 단어를 찾은 후 그 Line을 Hold Space에 저장한다.(h명령어를 통하여)
- 그 후 $는 마지막행을 의미하며 마지막행에 Hold Space의 내용을 Parttern Space에 복사한다. 대문자G의 내용은 패턴 스페이스에 내용이 있을 경우 뒤에 추가하는 명령어이다. 텍스트 맨 뒤로 복사되어 위와같은 효과를 낼 수 있다.