Skip to content

Sed

ed명령어와 grep명령어 기능의 일부를 합친 것이 sed(stream editor)명령어이다. sed명령어도 grep명령어와 같은 필터이지만 이 명령어는 파일을 수정할 수 있게 하는 반면 ed처럼 대화식 처리는 불가능하다. sed 명령어는 1개 라인씩 입력 라인을 읽어들여 표준 출력에 출력한다. sed는 각 라인을 읽을 때마다 ed에서 사용하던 형식의 대치작업을 실행한다. 일치하는 문자열이 있으면 그 문자열을 대치한 후 출력하고 일치하는 문자열이 없으면 그 라인은 수정되지 않고 그대로 출력된다. 이 sed 명령어가 ed보다 좋은 점은 라인들을 하나씩 읽고 , 수정하고, 출력하기 때문에 기억장치 안의 버퍼를 사용하지 않는다는 것이다. 버퍼를 사용하지 않으면 파일의 크기에 제한 없이 작업을 할 수 있다. ed와 같이 버퍼를 사용하는 경우는 버퍼의 크기보다 큰 파일은 처리할 수 없으며 대개 버퍼의 크기는 1MB정도이다. 따라서 sed는 아주 큰 파일을 처리할 때 주로 사용된다. sed 명령어를 호출하는 형식은 grep명령어와 같지만 완전한 형식의 대치 연산자를 사용한다는 점만이 다르다. 명령어 줄이나 쉘 스크립트에서 sed를 쓸 때는 쿼우팅과 몇몇 옵션이 필요할 지도 모릅니다.

Command

  • a\: 현재 행에 하나 이상의 새로운 행을 추가한다.
  • c\: 현재 행의 내용을 새로운 내용으로 바꾼다.
  • i\: 현재 행의 위에 삽입한다.
  • d: 행을 삭제한다.
  • l: 출력되지 않는 특수문자를 출력한다.
  • p: 행을 출력한다.
  • n: 다음 입력 행을 첫 번째 명령어가 아닌 다음 명령어에서 처리하게 한다.
  • q: sed를 종료한다.
  • r: 파일로부터 행을 읽어온다.
  • !: 선택된 행을 제외한 나머지 전체 행에 명령어를 적용한다.
  • s: 문자열을 치환한다.

어드레스 형식

  • number: 숫자는 특정한 행 번호에 적용된다.
  • first~step: 첫번째 어드레스가 가리키는 행부터 step 라인마다 한 번씩
  • $: 마지막 행
  • /regexp/: 정규식 패턴에 매치되는 값이 있는 라인
  • \cregexpc: c는 임의의 문자일 수 있는데, 역시 정규식을 가리킨다.
  • 0,addr2: 1,addr2에서 addr2가 정규식이면서 1번행에 매치될 때 정상적으로 처리되지 않는 문제를 해결하기 위해 사용한다.
  • addr1,+N: addr1외에 N행 만큼 더 선택한다.
  • addr1,~N: addr1외에 처음으로 만나는 N의 배수행까지 선택한다.

Options

  • -e: 다음에 나오는 문자열을 편집 명령어로 해석하게 한다. 1
  • -f: sed 스크립트 파일 지정에 사용.
  • -n: 각 입력(INPUT)에 대한 표준출력(stdout)을 억제한다.
  • -i: Edit files in-place. 즉 sed의 변경 결과를 파일에 바로 반영한다.
    • 이 옵션을 사용할 경우 OS에 따라 구현체가 조금씩 다르니 주의해야 한다.2
    • Linux 계열 구현체는 -i만 사용해도 되지만, BSD계열에서는 -i {extension}으로 사용해야 한다.
    • 이 옵션은 파을 자체를 바로 변경하지 않고, 임시파일을 생성한다. 따라서 해당 임시파일의 확장자를 저장하는 것이다.

In-place sed

$ find . -name "*.cpp" -o -name "*.hpp" | xargs sed -i .tmp "s/oldstr/newstr/g"

BSD계열 및 일반 Linux계열 모두 호환되는 방법은 아래와 같다.

$ sed -i.tmp "s/oldstr/newstr/g" temp.txt

Delete Examples

sed '1,5d' dummy.txt
Delete Line
sed '1d;2d;3d;$d' dummy.txt
Delete multiple lines
sed '2,4!d' dummy.txt
특정 줄만 제외하고 전부 제거
sed '/^$/d' dummy.txt
빈 줄 제거
sed '/the/d' dummy.txt
매치된 패턴 라인 제거
sed '/brown\|the/d' dummy.txt
\| 기호를 사용하여 구분된 단어 패턴 검색
sed '/the/{N;d;}' dummy.txt
패턴이 일치하면 줄을 삭제하고, 다음 줄도 추가 삭제
sed '/fox/,$d' dummy.txt
매치된 패턴부터 끝까지 라인 삭제

TAG

패턴의 일부를 "태그"하려면, 그것을 좌측에는 \(</code>로 우측에는 <code>\)로 둘러싸면 된다. 그 다음 치환패턴에서 첫 번째 태그는 \1로, 두 번째 것은 \2 등으로 인용할 수 있다. 예제는 아래와 같다.

sed 's/\(Pat\)\([^a-z]\)/\1ricia\2/g' ljs

INSERT NEW LINE

s///g를 사용할 경우 아래와 같이 사용하면 Newline을 추가할 수 있다.

sed -e 's/\(libtbag\/config\.h\>\)/\1\'$'\n#include <libtbag\/predef\.hpp>/g' unit.hpp

Detail comment

This works in bash, tested on Linux and OS X:

sed 's/regexp/\'$'\n/g'

In general, for $ followed by a string literal in single quotes bash performs C-style backslash substitution, e.g. $'\t' is translated to a literal tab. Plus, sed wants your newline literal to be escaped with a backslash, hence the \ before $. And finally, the dollar sign itself shouldn't be quoted so that it's interpreted by the shell, therefore we close the quote before the $ and then open it again.

여러 줄의 결과를 합치는 방법

다음의 도구를 사용하는 방법이 있다:

TODO

테스트 해 봐야 한다

There are oh so many ways to do it, here is one with sed:

sed -n "/^LABEL/ { N; N; s/\n/\t/g ; p }" filename

Explanation:

  • -n means "don't print the output automatically"
  • /^LABEL/: search for label
  • { ... }: command block
  • N; N; take two lines, append them to the pattern space
  • s/\n/\t/g: substitute the new lines by tabs in the pattern space
  • p: print out the pattern space
  • filename name of your file.

Tip

  • 쉘 스크립트에서 쿼우팅은 가급적 큰따옴표(")가 아닌 작은따옴표(')를 사용해야 에러가 안난다.
  • GNU 버전의 sed와 awk에서는 +를 쓸 수 있지만, 이스케이프(escape)를 해 줘야 된다. 34

Example

sed 's#3#99#g' datafile
s명령어 바로 다음에 오는 문자는 검색열과 치환열을 구분해주는 구분자이다. 기본적으로 /를 구분자로 사용하지만, 다른 문자로 바꿔 사용할 수 있다. 이는 /자체를 포함하는 문자열을 검색할 때 유용하다.
개인적으로 파일 경로에 포함될 수 없는 문자를 사용하는 것이 좋다. (; 등)
sed -e 's/:<:Rectangle:>:/Rect/g'
Rectangle "단어"를 Rect로 변경한다.
sed -e '0,/claudio/ s/claudio/claudia/' nomi
0번째 줄 부터 claudio 라는 패턴이 나타나기까지 사이에, claudio를 claudia로 변환. 즉, 1회만 claudio를 claudia로 변환하라는 의미.
sed '/^[ ]*$/d'
비어 있거나 공백으로 이루어진 줄은 삭제.
sed '1,3p' [파일]
파일의 1행에서 3행까지 출력한다.
sed '1,5!p' [파일]
파일의 1행에서 5행을 제외하고 출력하라.
sed -n 42p [파일]
파일의 42행을 출력한다. -n플래그를 사용해야 중복으로 출력되는 현상을 막을 수 있다.
sed "/^$/d" inputstring
모든 공백라인 제거.
sed "/^ *$/d" inputstring
Space로 이루어진 모든 공백라인 제거.
sed "8d" inputstring
8번째 라인 제거.
sed "1,/^$/d" inputstring
첫 라인부터 처음 나타나는 빈 줄까지 제거.
sed -n '100,$p'
100라인부터 끝 까지 출력.
sed -n '/BEGIN/$,p' sed -n '/BEGIN/,$p'
BEGIN문자열이 출력되는 순간 부터 끝($)까지 출력.
sed -n '1,/END/p'
첫 번째 줄 부터 END문자열이 출력되는 순간 까지 출력.
sed -n '/BEGIN/,/END/p'
BEGINEND사이를 모두 출력.
sed -n "/Pattern1/p" inputstring
Pattern1을 포함하는 라인을 출력. (-n 옵션이 꼭 필요)
sed "s/Pattern1/Pattern2/" inputstring
입력의 각 줄에서 처음 나오는 "Pattern1"을 "Pattern2"로 치환.
sed "s/Pattern1/Pattern2/g" inputstring
입력의 각 줄에서 "Pattern1"이 나올 때 마다 "Pattern2"로 치환.
sed "s/ *$//" inputstring
모든 줄의 끝에 나오는 빈 칸을 지워라.
sed "s/00*/0/g" inputstring
연속적인 모든 0을 하나의 0으로 압축(변환).
sed "/GUI/d" inputstring
"Pattern1"을 포함하는 모든 라인을 제거.
sed "s/GUI//g" inputstring
"Pattern1"이 나오는 라인에서 "Pattern1"을 제거.
sed 's/ */ /' list.txt
한개이상의 공백문자열을 하나의 공백으로 바꾼다
sed ‘/^love /a\ -----’ datafile
패턴 love로 시작하고 공백문자가 있는 행 다음에 명령어 a\뒤의 문자열을 추가한다.
sed ‘/love/i\ -----’ datafile
패턴 love를 찾은 후 명령어 i\ 다음에 오는 텍스트를 love가 포함된 행 위에 삽입한다.
sed ‘5q’ datafile
5행까지 출력한 후 sed프로그램 종료한다.
sed ‘/love/{ s/love/peace/;q; }’ datafile
패턴 love를 찾은 행에서 lovepeace로 치환되고 q명령어로 sed 종료한다.
sed -n '10p' file.txt
1줄만 출력
sed '5!/s/foo/bar/' file.txt
5번줄만 빼고 모든 라인에서 문자 치환
sed '/^hello/ s/h/H/' file.txt
특정문자로 시작하는 모든 라인에서 정규식 치환
sed '5,$ s/foo/bar/' file.txt
5번줄부터 마지막 라인까지만 치환
sed '/^$/d' file
빈파일 삭제
sed -nE '/^foo/,/^bar/p' file.txt
두 정규식 사이의 모든 라인 출력
sed 's_/bin/bash_/bin/sh_' file.txt
슬래시 포함 문자를 쉽게 찾기 위해 커스텀 딜리미터 사용
sed -E 's_([a-zA-Z0-9_]+) \1_\1_ig' f1
공백으로 나눠진 중복 문자열 제거(세번 중복된거는 제외)
sed 's_foo_bar_w replaced.txt' file.txt
특정 패턴을 찾아서 변경후, 수정된 것만 다른 파일로 저장
sed -e 's_foo_bar_' -e 's_hello_HELLO_' file.txt
여러개 동시에 치환
sed -E '/start/,/end/ s/#.*//' file.txt
두개 키워드 사이의 모든 코멘트 제거하고 빈줄 넣기
sed -E '/^#/d' f1

:#로 시작하는 모든 주석 지우기

sed '/start/q' file.txt
특정 패턴이 나타날때까지만 출력하기
sed '5 r newfile.txt' file.txt
특정 라인 이후에 파일을 삽입
sed '/foo/a\AFTER FOO' file.txt
특정 정규식 매칭부분 이후의 라인에 텍스트 추가
sed '/foo/c\FOO IS CHANGED' file.txt
특정 정규식 매칭된 라인을 교체
sed -E '/^#/w comments.txt' file.txt

:#으로 시작하는 모든 코멘트를 다른 파일에 저장

sed -n '1~2p' file.txt
모든 두번째 줄만 출력(한줄건너 한줄, 3/4 등으로 변경 가능)
sed -i.bak 's/hello/HELLO/' file.txt
파일을 직접 수정하지만 백업을 생성
sed -E '/^#/G G' file.txt
정규식 매칭 이후에 두개의 빈줄 추가

Text Processing Commands

텍스트 처리 명령어 목록

Text

Common

grep, sed, awk, cat, xargs, rev, tee, ack, tr, stdbuf

Diff

diff, patch

Cutting

cut, head, tail, less, more, split, watch

Sort

uniq, sort

Hash

base64, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum

Clipboard

clip (Windows), pbcopy (Mac OSX), pbpaste (Mac OSX), xclip (Debian)

E.T.C

regexp, parallel

See also

Favorite site

Tutorials

References


  1. 참고로 sed, awk, grep 모두, -e 옵션을 써서 다음에 나오는 문자열이 명령이나 명령 집합이라는 것을 지정해 준다. 만약에 문자열이 그냥 하나짜리 명령이라면, 이 옵션은 안 적어줘도 된다. 

  2. Linux와 FreeBSD(정확힌 Mac OSX)에서 테스트 하였다. 

  3. https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html 

  4. https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/x10468.html 

  5. How_to_use_SED_-_Wireframe.pdf 

  6. Stone.backrush.com-how_to_use_sed.zip 

  7. Adv-bash-scr-howto.zip 

  8. Mug896-sed-stream-editor-master-f59f136.zip (2020-10-07)