# Chap 21 - 고급 sed
기본 sed 편집 명령을 사용하다 보면 제약이 발생한다. 모든 sed 편집기 명령은 하나의 데이터 줄에서 기능을 수행한다.
sed 편집기는 여러 줄의 텍스트를 처리할 때 사용할 수 있는 3가지 특별한 명령을 포함한다.
N (next) : 멀티라인 그룹을 만들기 위해 데이터 스트림에서 다음 줄을 추가
D (delete) : 멀티라인 그룹에서 한 줄을 삭제
P (print) : 멀티라인 그룹의 한 줄을 인쇄
소문자 n 명령
: sed 편집기에게 명령의 시작 부분으로 돌아가지 않고 데이터 스트림 텍스트의 다음 줄로 가라고 지시한다.test@test:~/chap21$ cat data.txt
This is the header line
This is a data line
This is a last line.
## 빈 줄을 제거하는 sed 스크립트를 작성할 시 모든 빈 줄이 사라진다.
test@test:~/chap21$ sed '/^$/d' data.txt
This is the header line
This is a data line
This is a last line.
## header 패턴에 일치하는 Line을 찾아서 그 다음 라인(n)으로 가서 delete를 하는 sed 구문
test@test:~/chap21$ sed '/header/{n; d}' data.txt
This is the header line
This is a data line
This is a last line.
멀티라인 버젼을 살펴볼 것이다.
멀티라인 버전의 다음 줄 명령은 이미 패턴 영역에 있는 텍스트의 다음 줄을 추가시킨다.
⇒ 패턴 영역에 데이터 스트림의 텍스트 2줄을 추가한 효과가 있다.
⇒ 텍스트의 줄은 여전히 줄바꿈 문자로 구분되지만 sed 에디터는 이제 텍스트의 두 줄을 한 줄처럼 처리할 수 있다.
test@test:~/chap21$ cat data2.txt
This is the header line.
This is the first line.
This is the second line.
This is the last line.
test@test:~/chap21$ sed '/first/{N; s/\n/ / }' data2.txt
This is the header line.
This is the first line. This is the second line.
This is the last line.
first라는 단어가 포함되어 있는 텍스트 줄을 검색한다.
그 줄과 다음줄을 결합하는 N 명령을 사용
; 는 해당 명령의 성공 유무와 상관 없이 다음 명령을 실행시킨다.
s/\n/ /
⇒ 바꾸기 명령(switch)으로 줄바꿈 문자(\n)를 빈 칸으로 바꾼다.
그 결과 sed 편집기의 출력에서는 텍스트 파일의 두 줄이 한 줄로 표시된다.
test@test:~/chap21$ cat data3.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
test@test:~/chap21$ sed 'N; s/System Administrator/Desktop User/' data3.txt
On Tuesday, the Linux System
Administrator`s group meeting will be held.
All Desktop Users should attend.
Thank you for your attendance.
test@test:~/chap21$ sed 'N
> s/System\nAdministrator/Deskop\nUser/
> s/System Administrator/Desktop User/
> ' data3.txt
On Tuesday, the Linux Deskop
User`s group meeting will be held.
All Desktop Users should attend.
Thank you for your attendance.
test@test:~/chap21$ cat data4.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
test@test:~/chap21$ sed 'N
s/System\nAdministrator/Deskop\nUser/
s/System Administrator/Desktop User/
' data4.txt
On Tuesday, the Linux Deskop
User's group meeting will be held.
All System Administrators should attend.
### 맨 아랫줄까지 인식할 수 있도록 sed 변경
### 한 줄 버전의 명령을 N 명령 앞에 옮겨 놓고 멀티라인 명령이 N명령 다음에 나타나도록 함으로써
### 이 문제를 해결할 수 있다.
test@test:~/chap21$ sed '
> s/System Administrator/Desktop User/
> N
> s/System\nAdministrator/Desktop\nUser/
> ' data4.txt
On Tuesday, the Linux Desktop
User`s group meeting will be held.
All Desktop Users should attend.
test@test:~/chap21$ cat data4.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
test@test:~/chap21$ sed 'N; /System\nAdministrator/D' data4.txt
Administrator`s group meeting will be held.
All System Administrators should attend.
test@test:~/chap21$ cat data5.txt
This is the header line.
This is the first line.
This is the last line.
test@test:~/chap21$ sed '/^$/{N; /header/D}' data5.txt
This is the header line.
This is the first line.
This is the last line.
test@test:~/chap21$ cat data3.txt
On Tuesday, the Linux System
Administrator`s group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
test@test:~/chap21$ sed -n 'N; /System\nAdministrator/P' data3.txt
On Tuesday, the Linux System
패턴 영역과 대기 영역을 이해할 필요가 있다.
패턴 영역 : 명령을 처리하는 동안 sed 편집기가 검사할 텍스트를 보유하는 활성 버퍼 영역
대기 영역 : 패턴 영역에서 텍스트의 줄을 가지고 작업하는 동안 다른 텍스트 줄을 임시로 보관하기 위한 또 다른 버퍼 영역
test@test:~/chap21$ cat data2.txt
This is the header line.
This is the first line.
This is the second line.
This is the last line.
test@test:~/chap21$ sed -n '/first/{h; p; n; p; g; p;}' data2.txt
This is the first line.
This is the second line.
This is the first line.
## 역순으로 출력할 수 있다.
test@test:~/chap21$ sed -n '/first/{h; n; p; g; p;}' data2.txt
This is the second line.
This is the first line.