insert, append, change

라인 에디터인 ed 를 stream 버전으로 만든 것이 sed 이므로 sed 를 이용하면 파일을 쉽게 수정할 수 있습니다.

# multiple lines 을 입력하는 방법 ( 라인 끝에 '\' 문자를 붙인다 )
sed -i '2a \
192.168.100.1     gateway\
192.168.100.2     webserver\
192.168.100.3     dbserver
' hosts

# 공백 라인을 만들려면
$ sed -i '4a\\' hosts       # 공백 라인 1 개
$ sed -i '4a\\n' hosts      # 공백 라인 2 개
$ sed -i '4a\\n\n' hosts    # 공백 라인 3 개

이 명령들은 기본적으로 pattern space 와는 관계가 없는 명령들로 입력한 값이 sed 에의해 queue 되었다가 프린트됩니다. 그러므로 -n 옵션으로 출력을 금지할 수도 없고 s 명령으로 수정을 할 수도 없습니다.

pattern space 에 직접 insert, append 하는 방법은 Tips 메뉴를 참조하세요.

1. 현재 pattern space 내용에는 영향을 주지 않습니다.
2. -n 옵션 설정에 관계없이 입력한 값이 프린트됩니다.
3. 뒤이어 계속해서 명령을 사용하려면 -e 옵션을 이용해서 분리해야 합니다.
$ seq 3 | sed 'i ---'              $ seq 3 | sed 'a ---'
---                                1
1                                  ---
---                                2
2                                  ---
---                                3
3                                  ---

$ seq 5 | sed '2,3 a ---'          $ seq 5 | sed '2,3 c ---'
1                                  1
2                                  ---
---                                4
3                                  5
---
4
5

$ seq 3 | sed -e '2i -----' -e '2a ====='
1
-----
2
=====
3

$ seq 3 | sed -e '2{i -----' -e 'a =====' -e '}' 
1
-----
2
=====
3

$ echo abc | sed -e '/ab/{i ----' -e '}' -e '/bc/{i ====' -e '}'
----
====
abc

-n 옵션 설정에 관계없이 입력한 값이 프린트되며 다음과 같은 차이가 있습니다.

# 'i' 는 해당 명령이 위치한 곳에서 프린트되지만
# 'a' 는 명령 위치에 상관없이 항상 마지막에 append 됩니다.
$ seq 3 | sed -n -e '2a ====='  -e 's/2/XXXXX/p' -e '2i -----'
XXXXX
-----
=====

$ seq 3 | sed -n -e '2a =====' -e '2i -----' -e 's/2/XXXXX/p'
-----
XXXXX
=====

# '-n' 옵션을 사용하지 않은 경우는 차이가 없다.
$ seq 3 | sed -e '2a =====' -e 's/2/XXXXX/' -e '2i -----'
1
-----
XXXXX
=====
3

$ seq 3 | sed -e '2a =====' -e '2i -----' -e 's/2/XXXXX/'
1
-----
XXXXX
=====
3

i, a 명령의 입력값은 일반 텍스트 스트링이므로 공백을 포함해서 ; 문자도 올 수 있기 때문에 뒤이어 계속해서 명령을 사용하려면 -e 옵션을 이용해 분리해야 합니다.

# '-e' 옵션을 이용해 분리하지 않을 경우 
$ seq 3 | sed -e '2i -----; 2a ====='
1
-----; 2a =====
2
3

다음은 multiple lines 을 입력하는 방법입니다. a 명령도 방법은 같습니다.

$ seq 3 | sed '2i -----\               $ seq 3 | sed '2i \
-----\                                 -----\
-----'                                 -----\
                                       -----'
1                                      
-----                                  1
-----                                  -----
-----                                  -----
2                                      -----
3                                      2
                                       3

다음은 shell 변수를 사용하는 방법입니다.

$ AA=100

$ seq 3 | sed -e "2a --${AA}--"
1
2
--100--
3

$ seq 3 | sed -e '2a\' -e "--${AA}--"
1
2
--100--
3

1. 현재 pattern space 에 있는 내용을 전부 삭제합니다.
2. -n 옵션 설정에 관계없이 입력한 값이 프린트됩니다.
3. pattern space 내용이 전부 삭제된 상태이므로 명령 사이클을 종료하고 new cycle 을 시작합니다.

그러므로 i, a 명령과 같이 사용하려면 c 명령이 제일 뒤에 와야 합니다.

$ seq 5 | sed '2c XXXXX'
1
XXXXX
3
4
5

# 'c' 명령이 실행되고 사이클이 종료되므로 'i', 'a' 값은 표시가 안된다.
$ seq 5 | sed -e '2c XXXXX' -e '2i -----' -e '2a =====' 
1
XXXXX
3
4
5

# 'c' 명령이 제일 뒤에 와야 한다.
$ seq 5 | sed  -e '2i -----' -e '2a =====' -e '2c XXXXX'
1
-----
XXXXX
=====
3
4
5

$ seq 5 | sed -e '2,4c XXXXX' -e '2,4i -----' -e '2,4a =====' 
1
XXXXX
5

$ seq 5 | sed  -e '2,4i -----' -e '2,4a =====' -e '2,4c XXXXX'
1
-----
=====
-----
=====
-----
XXXXX
=====
5

# 기본적으로 pattern space 에 있는 내용이 전부 삭제된다.
$ seq 5 | sed  -e 'N;N' -e '3c -----'
-----
4
5