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의 변경 결과를 파일에 바로 반영한다.
In-place sed
BSD계열 및 일반 Linux계열 모두 호환되는 방법은 아래와 같다.
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
등으로 인용할 수 있다. 예제는 아래와 같다.
INSERT NEW LINE
s///g
를 사용할 경우 아래와 같이 사용하면 Newline을 추가할 수 있다.
Detail comment
This works in bash, tested on Linux and OS X:
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.
여러 줄의 결과를 합치는 방법
다음의 도구를 사용하는 방법이 있다:
- bash - Concatenate lines given by grep -A - Stack Overflow
- sed#여러 줄의 결과를 합치는 방법
- awk#여러 줄의 결과를 합치는 방법
- tr#여러 줄의 결과를 합치는 방법
TODO |
테스트 해 봐야 한다 |
There are oh so many ways to do it, here is one with sed:
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'
-
BEGIN
과END
사이를 모두 출력.
-
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
를 찾은 행에서love
가peace
로 치환되고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
|
See also
Favorite site
- [추천] SED 사용방법 5
- [추천] regexper (도식화)
- Sed(streamlined editor) 명령어 사용방법
- SED 명령어 사용법 6
- 리눅스포털: Sed(streamlined editor)
- KLDP: 고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 // 텍스트 처리 명령어 7
- KLDP: 고급 Bash 스크립팅 가이드: 부록 B.1. Sed
- Wikipedia (en) SED에 대한 설명
- SED 및 SWK사용법
- SED 스트림 에디터
- sed 및 awk 사용법
- [추천] sed 개행 문자 제거 (정규식)
Tutorials
- [추천] Sed stream editor 가이드 - mug896 8 (archive)
References
-
참고로 sed, awk, grep 모두,
-e
옵션을 써서 다음에 나오는 문자열이 명령이나 명령 집합이라는 것을 지정해 준다. 만약에 문자열이 그냥 하나짜리 명령이라면, 이 옵션은 안 적어줘도 된다. ↩ -
https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html ↩
-
https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/x10468.html ↩
-
How_to_use_SED_-_Wireframe.pdf ↩
-
Stone.backrush.com-how_to_use_sed.zip ↩
-
Adv-bash-scr-howto.zip ↩
-
Mug896-sed-stream-editor-master-f59f136.zip (2020-10-07) ↩