Next
1. 자동 출력 모드일 경우 현재 pattern space 내용을 프린트합니다.
2. pattern space 내용이 전부 삭제됩니다.
3. 입력 스트림으로부터 새로 라인을 읽어들이고 현재 명령 사이클 위치에서 진행을 계속합니다.
4. 읽어들일 라인이 없으면 exit 합니다.
1. 먼저 newline 을 pattern space 에 append 합니다.
2. 입력 스트림으로 부터 라인을 읽어들여서 append 합니다.
3. 읽어들일 라인이 없으면 exit 합니다.
$!N 의 사용
N
명령에서 주의 깊게 봐야 될 항목은 3번 읽어들일 라인이 없으면 exit 한다
입니다.
N
명령은 주로 multiple lines 를 다룰 때 사용하는데 현재 pattern space 에 마지막 라인이
입력된 상태에서 N
명령을 만나게 되면 이후 명령들이 실행되지 않고 exit 되기 때문에
필요에 따라서 $!N
(마지막 라인이 아닐 경우만 다음 라인을 읽어들인다) 형식을 사용해야 합니다.
다음의 예제는 숫자 라인 다음에 알파벳 라인이 올 경우 XXX 로 변경하는 스크립트입니다.
이때 N
명령을 사용하게 되면 마지막 라인인 555 가 표시되지 않는 것을 볼수 있습니다.
좀 더 자세한 내용은 multiple lines 메뉴에서 찾아볼수 있습니다.
$ cat file
111
222
ABC
333
444
DEF
555
# 'N' 을 사용할 경우
$ sed -En 'N; s/[0-9]+\n[A-Z]+/XXX/; P;D' file
111
XXX
333
XXX
<---- 마지막 라인 555 가 표시되지 않는다.
# '$!N' 을 사용할 경우
$ sed -En '$!N; s/[0-9]+\n[A-Z]+/XXX/; P;D' file
111
XXX
333
XXX
555 <---- 정상적으로 마지막 라인이 표시된다.
Quiz
어떤 명령의 출력이 아래와 같이 title
과 value
두 개의 라인으로 반복됩니다.
이것을 title : value
하나의 라인으로 만들어서 출력하려면 어떻게 할까요?
$ syscat ...
[ physical_block_size ]
512
[ logical_block_size ]
512
[ zone_append_max_bytes ]
0
[ io_timeout ]
30000
[ nr_requests ]
64
[ write_cache ]
write back
[ max_segment_size ]
65536
. . .
pattern space 에 라인이 입력됐을 때 N
명령을 이용해 라인을 하나 더 읽어들여
append 하고 newline 을 space 로 변경하면 됩니다.
$ syscat ... | sed 'N; s/\n/ /'
[ physical_block_size ] 512
[ logical_block_size ] 512
[ zone_append_max_bytes ] 0
[ io_timeout ] 30000
[ nr_requests ] 64
[ write_cache ] write back
[ max_segment_size ] 65536
. . .
2 .
다음과 같이 이름, 나이, 직업을 항목으로 갖는 레코드가 있습니다. 이중에서 나이가 39 이고 직업이 수학자인 레코드를 출력하는 것입니다.
$ cat ./list.txt
이름: 아이유
나이: 29
직업: 가수
이름: 허준이
나이: 39
직업: 수학자
이름: 백종원
나이: 56
직업: 요리연구가
--------------------
$ sed -n '/이름/ { # 입력라인이 "이름" 과 매칭이 되면
N # 다음 라인을 읽어들여 append 합니다.
/나이: 39$/! d # 마지막 라인이 매칭이 안되면 d 로 삭제하고 다시시작.
N # 다음 라인을 읽어들여 append 합니다.
/직업: 수학자$/! d # 마지막 라인이 매칭이 안되면 d 로 삭제하고 다시시작.
p # pattern space 에 있는 내용을 모두 출력합니다.
}' ./list.txt
이름: 허준이
나이: 39
직업: 수학자