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:
-
-nmeans "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 -
filenamename of your file.
Tip
- 쉘 스크립트에서 쿼우팅은 가급적 큰따옴표(
")가 아닌 작은따옴표(')를 사용해야 에러가 안난다. - GNU 버전의 sed와 awk에서는
+를 쓸 수 있지만, 이스케이프(escape)를 해 줘야 된다. 23
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 사용방법 4
- [추천] regexper (도식화)
- Sed(streamlined editor) 명령어 사용방법
- SED 명령어 사용법 5
- 리눅스포털: Sed(streamlined editor)
- KLDP: 고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 // 텍스트 처리 명령어 6
- KLDP: 고급 Bash 스크립팅 가이드: 부록 B.1. Sed
- Wikipedia (en) SED에 대한 설명
- SED 및 SWK사용법
- SED 스트림 에디터
- sed 및 awk 사용법
- [추천] sed 개행 문자 제거 (정규식)
Tutorials
- [추천] Sed stream editor 가이드 - mug896 7 (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) ↩