s (substitute)s/pattern/replacement/flags
s 커맨드는 디폴트로 각 스트림에 대해 하나의 문자열만 대체한다.
flags
숫자(몇 번째 패턴을 바꿀지 지정)
g: 모든 패턴을 변경
p: 변경되는(패턴 매치되는) 줄만 변경해서 출력(-n; 출력 억제; 옵션과 주로 같이 사용)
w file: 파일에 변경 내용 작성
s 구분자로 사용되는 ' / ' 가 문자열에 포함되는 경우, 이스케이프가 복잡해지기 떄문에
!를 사용할 수 있음
sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
sed 's!/bin/bash!/bin/csh!' /etc/passwd
특정 줄에만 명령어 적용
기본적으로 sed는 모든 줄에 대해 각각 스트림으로 입력을 받고 이를 처리한다.
주소를 이용해서 특정 줄에만 대해서 명령을 적용할 수 있다.
[address]command
address {
command1
command2
command3
}
ex)
sed '2s/dog/cat' data.txt
sed '2,3s/dog/cat' data.txt
sed '2,$s/dog/cat' data.txt
sed '2{
s/fox/elepahnt
s/dog/cat
}' data.txt
특정 패턴 매칭 줄에만 명령어 적용/pattern/command
sed -n '/csian/s/zsh/csh/p' /etc/passwd
복잡한 패턴은 '정규 표현식'을 이용해서 생성하고 사용할 수 있다.
echo -e 'line1\nlin2\nline3\nline4' > data.txt
sed 'd' data.txt
sed '3d' data.txt
sed '2,3d' data.txt
sed '2,$d' data.txt
sed '/pattern/d' data.txt
sed '/1/,/3/d' data.txt
범위 지정 줄 삭제는 첫번째 패턴 매칭 줄에서 삭제 기능을 on 하고, 두번째 패턴 매칭 줄에서 삭제 기능을 off 함을 의미한다.
매칭이 될 때마다 삭제 기능이 켜지고 꺼짐
텍스트 삽입 및 첨부insert: 지정된 줄 바로 앞에 새로운 줄 추가
append: 지정된 줄 바로 뒤에 새로운 줄 추가
삽입 첨부 기능은 한 줄의 커맨드 라인에 작성할 수 없다.
반드시 삽입 또는 첨부줄은 별개의 줄에서 지정해 주어야 함
sed '[address]command\
new line'
echo "Test line 2" | sed 'i\
Test Line 1'
echo "Test line 1" | sed 'a\
Test Line 2'
echo -e 'Line 1\nLine 2\nLine 4' > data.txt
sed '3i\
Line 3
$a\
Line 5\
Line 6' data.txt
rm data.txt
echo -e 'Orig Line 1\nOrig Line 2\nOrig Line 4' > data.txt
sed '3c\
Changed Line 3' data.txt
sed '/Line 4/c\
Changed Line 3' data.txt
rm data.txt
여러 개의 줄에 대해 변경을 시도하게 되면, 하나의 줄만 변경이 되고 나머지 줄은 삭제됨
문자 변환y: 한개의 문자 각각에 대해서 실행
(inchars와 outchars length가 다른 경우 오류)
문자 변환은 전역 명령으로 특정한 영역에 대한 실행이 불가능함
[address]y/inchars/outchars
출력 명령(플래그)p: 텍스트 줄을 출력
등호(=): 줄 번호를 출력
l: 줄의 내용을 모두 출력
sed -n '2,3p' data.txt
sed -n '/3/{
p # 텍스트 변경 전에 출력
s/line/test/p # 텍스트 변경 후 출력
}' data.txt
sed '=' data.txt
sed -n '/number 4/ {
= # 줄 출력
p # 내용 출력
}' data.txt
sed -n 'l' data.txt
파일에 쓰기기본적으로 sed는 STDOUT으로 출력할 뿐 원본 파일은 변경하지 않는다.
w 명령을 통해 새로운 파일(혹은 기본 파일) 줄을 기록할 수 있다(쓰기 권한이 있는 파일 ONLY)
[address]w filename
sed '1,2w newfile.txt' data.txt
sed '/pattern/w newfile.txt' data.txt
파일을 읽고 쓰기다른 파일의 내용을 읽고 이를 다른 파일에 쓸 수 있다.
r
[address]r filename
sed '3r readfile.txt' data.txt
sed '/pattern/r readfile.txt' data.txt
read and delete line
echo -e 'People1 Name1\nPeople2 Name2\nPeople3 Name3' > list.txt
echo -e 'Would the following people:\nLIST\nPlease report to the captain.' > notice.std
sed '/LIST/ {
r list.txt # LIST 앞에 삽입
d # LIST 줄 삭제
}' notice.std
rm list.txt notice.std