Read , Write

이 명령들도 pattern space 와 관계가 없는 명령들로 읽어들인 파일 내용이 sed 에의해 queue 되었다가 프린트됩니다. 그러므로 -n 옵션으로 출력을 금지할 수도 없고 s 명령으로 수정을 할 수도 없습니다.

한가지 주의할 점은 unix 에서 파일명은 /, NUL 문자를 제외하고 모두 허용하므로 파일명 뒤에 다른 문자가 오면 안됩니다. 연이어서 명령을 사용하려면 -e 옵션을 이용해 식을 분리해 작성해야 합니다.

1. 현재 pattern space 내용에는 영향을 주지 않습니다.
2. -n 옵션 설정에 관계없이 읽어들인 파일 내용이 프린트됩니다.
3. a (append) 명령과 같이 항상 라인 마지막에 파일 내용을 출력합니다.
4. r 명령은 파일 전체 라인을 읽어들이고, R 명령은 첫 번째 라인부터 순차적으로 읽어들입니다.
5. 파일이 존재하지 않을 경우 에러 메시지 없이 empty 파일로 간주하고 진행합니다.
6. 파일명 뒤에 계속해서 명령을 사용하려면 -e 옵션을 이용해 식을 분리해야 합니다.
$ cat file1
aaa
bbb
ccc

$ seq 5 | sed '2r file1'   
1
2
aaa
bbb
ccc
3
4
5

# 'R' 명령은 첫 번째 라인부터 순차적으로 읽어들입니다.
$ seq 5 | sed 'R file1'
1
aaa
2
bbb
3
ccc
4
5

1. open 된 파일은 sed 명령이 종료될 때까지 close 되지 않고 계속해서 append 됩니다.
   이것은 s/../../w file 명령에서 사용되는 동일한 이름의 파일과도 연계됩니다.
2. w 은 현재 pattern space 내용 전체를 write 합니다.
3. W 은 현재 pattern space 에 있는 내용 중 첫 번째 라인만 write 합니다.
4. 파일명 뒤에 계속해서 명령을 사용하려면 -e 옵션을 이용해 식을 분리해야 합니다.
# 명령 사이클이 시작하면서 sed 에의해 라인 하나가 읽혀지고
# 3개의 'N' 명령에 의해 3개의 라인이 추가로 읽혀지므로 
# 1,2,3,4 / 5,6,7,8 / 9,10,11,12 / ... 단위로 파일에 쓰여지게 됩니다.
# 그러므로 출력 결과에는 마지막 9,10 번 라인이 제외된걸 볼수가 있습니다.
$ seq 10 | sed -n 'N;N;N;w file2'  

$ cat file2
1
2
3
4
5
6
7
8

# 마찬가지로 1,2,3,4 / 5,6,7,8 / 9,10,11,12 / ... 단위로 파일에 쓰여지는데
# 'W' 명령은 첫 번째 라인만 쓰기를 하므로 1, 5번 라인만 저장이된걸 볼수가 있습니다.
$ seq 10 | sed -n 'N;N;N;W file2' 

$ cat file2
1
5

파일 이름은 해당 식에서 마지막에 위치해야 합니다. 그렇지 않으면 뒤이어지는 문자가 파일명으로 인식이 되어 오류가 발생합니다. 연이어서 명령을 작성하려면 -e 옵션을 이용해 식을 분리해야 합니다.

# '/dev/stderr}' 가 파일 이름이 된다.
$ echo 111 | sed -n '/111/{w /dev/stderr}'
sed: couldn't open file /dev/stderr}: Permission denied

$ echo 111 | sed -n -e '/111/{w /dev/stderr' -e '}'
111

# '/dev/stderr;p' 가 파일 이름이 된다.
$ echo 111 | sed -n '/111/w /dev/stderr;p'
sed: couldn't open file /dev/stderr;p: Permission denied

# 다음과 같이 '-e' 옵션을 이용해 분리해 작성해야 한다.
$ echo 111 | sed -n -e '/111/w /dev/stderr' -e p
111
111