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