삽질블로그
SED 명령어 사용법 본문
http://linuxstory1.tistory.com/ 에서 퍼왔습니다.
SED 명령어 사용법
[스트림 편집기(SED)]
ed명령어와 grep명령어 기능의 일부를 합친 것이 sed(stream editor)명령어이다. sed명령어도 grep명령어와 같은 필터이지만 이 명령어는 파일을 수정할 수 있게 하는 반면 ed처럼 대화식처리는 불가능하다. sed명령어는 1개 라인씩 입력 라인을 읽어들여 표준출력으로 출력한다.
sed는 각 라인을 읽을 때마다 ed에서 사용하던 형식의 대치작업을 실행한다. 일치하는 문자열이 있으면 그 문자열을 대치한 후 출력하고 일치하는 문자열이 없으면 그 라인은 수정되지 않고 그대로 출력된다.
이 sed명령어가 ed보다 좋은 점은 라인들을 하나씩 읽고, 수정하고, 출력하기 때문에 기억장치 안의 버퍼를 사용하지 않는다는 것이다. 버퍼를 사용하지 않으면 파일의 크기에 제한 없이 작업을 할 수 있다. ed와 같이 버퍼를 사용하는 경우는 버퍼의 크기보다 큰 파일은 처리할 수 없으며 대개 버퍼의 크기는 1MB정도이다. 따라서 sed는 아주 큰 파일을 처리할 때 주로 사용된다.
sed 명령어를 호출하는 형식은 grep명령어와 같지만 완전한 형식의 대치 연산자를 사용한다는 점만이 다르다.
[sed 명령어 사용법]
----------------
치환(substitute)
----------------
sed 's/addrass/address/' list.txt : addrass를 address로 바꾼다. 단, 원본파일을 바꾸지 않고 표준출력만 한다.
sed 's/\t/\ /' list.txt : 탭문자를 엔터로 변환
------------
삭제(delete)
------------
sed '/TD/d' 1.html : TD 문자가 포함된 줄을 삭제하여 출력한다.
sed '/Src/!d' 1.html : Src 문자가 있는 줄만 지우지 않는다.
sed '1,2d' 1.html : 처음 1줄, 2줄을 지운다.
sed '/^$/d 1.html : 공백라인을 삭제하는 명령이다. (★★★)
--------------------------
sed 명령어의 다양한 사용예제
--------------------------
1. 특정문자열 바꾸기
2. 특정문자열이 포함된 행 삭제하기
3. 특정 문자열이 포함된 행에서 특정문자만 삭제하기
4. 파일의 일부만 편집해야 할 경우 라인의 범위를 지정하여 사용 가능
5. 라인 번호 대신 문맥을 범위로 지정한 경우
또한 문자열 goodbye를 만난 이후에도 다시 다른 hello가 등장하면 다음 goodbye가 나올 때까지 대치 작업은 반복된다.
6. 세번째 라인을 삭제
7. hello 문자가 들어있는 line만 프린트
8. 모든 line 출력과 동시에 hello line이 중복해서 나타남
9. princess 또는 Princess를 포함하고 있는 라인들을 삭제함
10. 라인 1부터 hello를 포함하고 있는 첫번째 라인까지 모든라인들을 삭제함
11. datafile 안의 데이터로부터 처음 세 개의 문자들을 삭제
12. datafile 안의 데이터로부터 마지막 세 개의 문자들을 삭제
13. 각 라인의 첫 번째 공백에서부터 마지막까지 삭제
14. 각 라인의 처음부터 맨 마지막 공백까지 삭제
15. 각 라인의 처음부터 : 문자가 있는 곳(:문자포함)까지 삭제
[sed 명령 하이라이트]
1. 각 라인마다 뒤에 Hello World! 문자를 입력
2. 3번재라인 뒤에 Good Morning 문자 삽입
3. 기존의 라인들을 Oh! My God!!! 문자로 대체시킴
4. q명령은 편집기로 하여금 그것이 명시된 라인에 도착한 뒤 중지하게 한다. 즉, 이 예제에서는 2라인만 보여주고 중지한다.
5. 특정라인의 문자 치환
※ 특정문자 전체를 바꾸려면 sed 's/hello/#####/g' datafile 과 같이 사용
/^$/
공백라인, 즉 라인의 시작과 끝 사이에 아무것도 없는 라인과 부합한다. 이것은 공백 스페이스들로 된 라인과는 부합하지 않는바, 스페이스 자체가 문자이기 때문이다.
[간단한 sed 해법]
1. 모든 공백 라인 제거
※ sed '/^ *$/d' --> space로 만들어진 공백까지 제거
(조심! ^와 *사이에 공백이 있어야 한다)
2. 각 line마다 공백라인 추가
3. 각 line의 시작을 5 space로 대체
[sed 명령어의 또다른 기능]
sed명령어의 -f(file)선택자를 사용하면 명령어를 일일이 키보드에서 입력하지 않고 하나의 파일에 기억시켜 놓고 사용할 수도 있다.
# sed -f command.file in.file
여러 개의 명령어를 연속적으로 자주 사용할 때 이 명령어 파일이 유용하게 사용된다.
예를 들어 다음과 같은 복수 개의 명령어가 파일에 기억되어 있는 경우는
# vi command.file
s/hello/goodbye
s/good/bad
다음과 같은 명령어를 입력하면 다음과 같이 출력된다.
# echo "1234hello5678" | sed -f command.file
=> 1234badbye5678