@2021-07-01
11:36:26
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 옵션을 사용할 경우 원본을 바꿀수 있게 된다.
패턴 버퍼(스페이스)
- 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
3. 특정 단어로 시작하는 행들 추출하기
- 특정 문자열을 추출하기 위해서는 "/원하는 문자열/"를 입력해주면 된다.
- 특정 문자열로 시작하는 단어를 추출하기 위해서는 다음과 같이 입력하면 된다 "/^원하는 문자열/"
- 여기서 ^는 메타문자로 "시작"을 의미한다.
4. 파일에서 공백 및 빈줄 제거하기
- 메타문자 ^(시작), $(끝)을 알리는 문자로 행의처음과 행의끝을 의미한다.
- d옵션은 delete의 약자로 삭제를 의미한다.
- 위의 문자를 해석하면 행의 처음과 행의 끝에서 빈 Line들을 지우고 내용을 출력해주라는 것을 의미한다.
- 위의 명령어를 수행하게 되면 빈 Line을 제거하고 Redirection으로 test02라는 파일로 저장하라는 것을 의미한다.
- *는 메타문자로 앞의 문자를 0개 이상 찾는다.
- 행의 시작이 0개 이상의 공백으로 이뤄지다 끝을 맺는것이기 때문에 공백이거나 빈 Line을 찾아낸다는 의미한다.
5. 단어 치환
- 파일의 특정 문자열을 원하는 문자로 치환하기 위해서는 s 플래그를 사용하면 된다. s는 Substitution으로 치환을 의미한다.
- g 플래그는 치환이 행에서 전체를 대상으로 이루어진다는 것을 의미한다. sed명령어는 Line단위로 이루어지기 때문에 g플래그를 사용할 경우 전체 Line에 대해서 수행한다는 것을 의미한다.
- 위의 명령어는 파일의 전체에서 "sed"로 시작하는 문자열을 "substitution" 문자열으로 변경시킨다는 것을 의미한다.
- 위에서는 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)
- 위 sed '/Hello/r addfile' test03이라는 명령어는 다음과 같이 해석할 수 있다.
- test03파일에서 Hello라는 특정 문자열을 찾아 읽은 후 addfile이라는 파일에 있는 Line을 삽입하라.
- 따라서 해당 명령어 수행시 Hello Line뒤에 addfile의 내용이 추가된 것을 확인할 수 있다.
다른 파일에다가 쓰는 명령어(w)
- 위의 sed -n '/Hello/w test02' test01이라는 명령어는 다음과 같이 해석할 수 있다.
- test01의 Hello로 시작하는 Line을 읽어서 해당 라인을 test02라는 파일로 저장하라
수정할 파일에 내용 추가하기 명령어(a\)
- ^시작문자열이 Hello로 시작하는 Line을 찾아서 a\명령어를 사용하여 특정문자열을 추가하는 명령어
Parttern Space 및 Hold Space 활용하기
- 위의 명령어는 test02파일에서 Hello라는 단어를 찾은 후 그 Line을 Hold Space에 저장한다.(h명령어를 통하여)
- 그 후 $는 마지막행을 의미하며 마지막행에 Hold Space의 내용을 Parttern Space에 복사한다. 대문자G의 내용은 패턴 스페이스에 내용이 있을 경우 뒤에 추가하는 명령어이다. 텍스트 맨 뒤로 복사되어 위와같은 효과를 낼 수 있다.
'Linux Shell Script' 카테고리의 다른 글
Linux Shell Script(3) - Shell Script 시작하기 (0) | 2021.06.30 |
---|---|
Linux Shell Script(2) - Linux 셸 (shell)의 종류 (0) | 2021.06.30 |
Linux Shell Script(1) - Notepad++에서 Shell Script작성방법 (0) | 2021.06.30 |