IT/기초 지식

[Linux] sed 커맨드 상황별 사용법

개발자 두더지 2021. 11. 3. 22:45
728x90

쉘에서 데이터를 가공할 때 sed를 자주 사용하게 되는데, 상황에 따른 사용예를 정리한 포스팅이다. sed 커맨드는 Linux/Unix/BSD/OSX의 경우 기본적으로 설치되어 있으므로, sed 커맨드를 사용하기 위해 따로 설치할 필요는 없다.

 이 포스팅의 경우 Redhat계 Linux메인이므로 경우에 따라 작성법이 조금 다를 수 있다는 점을 유의하길 바란다. 그럼 바로 본론에 들어가도록 하겠다. 

 

'#'로 시작하는 코멘트행을 삭제할 때

sed '/^#/d' source.txt

 

빈 행을 삭제할 때

sed '/^#/d' source.txt

 

행의 맨 앞이 #인 행과 빈 행을 삭제

cat source.txt | grep -v '^#' | sed '/^$/d'

 

file1.txt의 15행부터 26행까지를 삭제한 후에 file2.txt로 저장하고 싶을 때

sed '15,26d' file1.txt > file2.txt

 

지정한 행 사이에 코멘트 아웃을 없애고 싶을 때 (89~94행번째의 맨 앞에 #를 삭제하고 싶을 때)

sed -i -e "89,94s:^#::" source.txt

 

CR+LF를 LF로 하고 싶을 때

sed -i -e 's/\r//g' source.txt

 

LF에 CR을 추가하여 CR+LF로 하고 싶을 때

#자주 틀리는 부분:'s/\n/\r\n/'으로는 치환되지 않음을 주의
sed -i -e 's/$/\r/' source.txt

 

1~9행번째를 삭제하고 싶을 때

sed '1,9d' sample.txt

 

첫 번째로 나타난 'Linux'문자를 '리눅스'로 바꾸고 싶을 때

sed -e 's/Linux/리눅스/3' source.txt

 

모든 'Linux'문자를 '리눅스'로 바꾸고 싶을 때

sed -e 's/Linux/리눅스/g' source.txt

 

여러 개의 문자열인 'Linux LINUX linux'를 모두 '리눅스'로 바꾸고 싶을 때

sed -e 's/(Linux|LINUX|linux)/リナックス/g' source.txt

# 혹은 맨 끝에 대소문자를 무시를 의미하는 i붙여도 괜찮다.
sed -e 's/linux/リナックス/gi' source.txt

 

 특정 문자를 포함한 행을 치환하고 싶을 때

# /~/ 로 지정하면~를 포함하는 행이라는 조건이 된다.
# /~/!으로 지정하면~를 포함하지 않는 행이라는 조건이 된다.

# ,으로 시작하는 행에 대한 예
# ,으로 시작하는 행에 대문자 소문자를 무시하고 모든'linux'를'리눅스'로

sed -e '/^,/s/linux/리눅스/gi' source.txt

# ,로 시작하지 않는 행에 대한 예
# ,로 시작하지 않는 행에 대해 대문자 소문자를 무시한 모든'linux'를 '리눅스'로

sed -e '/^,/!s/linux/리눅스/gi' source.txt

 

정규표현으로 매치한 문자를 추가하고 싶을 때

#'>'를 포함한 행으로, A-Z의 6자릿수[ ¥([A-Z]\{6\}¥) ]의 문자를 발견하면, 그것에 대해'_'를 붙이도록 한다.
# > CENTOS67이라는 문자열을 대상으로 한 경우,> CENTOS_67으로 치환하게 된다.
sed -e 's/^>¥([A-Z]\{6\}¥)/\1_/g' source.txt

 

치환한 행만을 표시하고 싶을 때 (p)

sed -n 's/linux/리눅스/p' source.txt

 

여러 개의 조건을 이용해 치환하고 싶을 때

sed -e 's/AAA/BBB/g' -e 's/CCC/DDD/g' source.txt

 

치환 범위를 한정하고 싶을 때

#11행~25행까지 AAA를 BBB로 치환한다.
sed -e '11,25 s/AAA/BBB/g' source.txt

 

시작과 끝의 문자열을 지정하여 치환하고 싶을 때

# '#START'부터 '#END'로 묶인 범위로 치환하기
sed -e '/#START/,/#END/ s/YYYYMM/201603/g' source.txt

 

특정 문자열이 나오면 건너뛰고 싶을 때

# '#SKIP'이 나오면 다음 행(N;)은 건너뛴다. 여러 행을 건너뛰고 싶은 경우N;N;와 같이 지정한다.
sed '/#SKIP/{N; s/YYYY/2016/g}' source.txt

 

문자열을 변환하고 싶을 때

sed -e "s/oldtext/newtext/g"

 

문자열을 삭제하고 싶을 때

sed -e "s/text//"

 

행 맨 앞에 text가 있는 경우, 삭제하고 싶을 때

sed -e "s/^text//"

 

행 끝에 text가 있는 경우, 삭제하고 싶을 때

sed -e "s/text\$//"

 

abc의 뒤에 문자열을 추가하고 싶을 때

sed -e "s/abc/abcxyz/g"

 

행 맨 앞에 문자열을 추가하고 싶을 때

sed -e "s/^/text/"

 

행의 맨 끝에 문자열을 추가하고 싶을 때

sed -e "s/\$/text/"

 

문자열을 abc로 바꾸고 싶을 때

sed -e "s/.*/abc/"

 

탭을 스페이스로 변환하고 싶을 때

sed -e 's/<tab>/<space>/g'

 

여러 개의 스페이스를 1개의 스페이스로 변환하고 싶을 때

sed -e 's/<space><space>*/<space>/g'

 

화이트 스페이스를 1개의 스페이스로 변환하고 싶을 때

sed -e 's/[<space><tab>][<space><tab>]*/<space>/g'

 

행 앞의 화이트 스페이스를 삭제하고 싶을 때

sed -e 's/^[<space><tab>]*//'

 

행 끝의 화이트 스페이스를 삭제하고 싶을 때

sed -e 's/[<space><tab>]*$//'

 

text를 포함한 행을 삭제하고 싶을 때

sed -e "/text/d"

 

공백행을 삭제하고 싶을 때

sed -e '/^$/d'

 

5행부터 20행을 변환하고 싶을 때

sed -e "5,20s/oldtext/newtext/g"

 

첫 번째 행을 삭제하고 싶을 때

sed -e '1d'

 

첫 번째 행을 표시하고 싶을 때

sed -n '1p'

 

특정한 수의 행이 되면 무엇인가를 적용하고 싶을 때

# 45행마다 개행하는 예
sed 's/.\{45\}/&\n/g'  source.txt

 

메타 문자(잘 잊어버리는 것들)

^   맨 앞
$   맨 뒤
.   임의의 1 문자
*   직전의 문자를 0회 이상 반복
\+  직전의 문자를 1회 이상 반복
\?  직전의 문자가 0회 혹은 1회만 출현
[]  문자 클래스,[abc0-9] 이면 숫자와 a, b, c 중 어떠한 1 문자
\|  OR、[ab|ap] 이면 ab 혹은 ap
\{3\}   직전의 문자가 3번만 출현
\{3,5\} 직전의 문자가 3〜5번 출현
\b  단어 구분

 

어드레스 커맨드(거의 s만 사용하는듯하다)

d   그 행을 출력하지 않는다
p   그 행을 출력한다.-n 를 붙이면 변환 전의 것은 출력하지 않는다
s   치환
y   한 개의 문자씩 치환
q   종료

 

SED 옵션(대체로 파이프를 통하므로 덮어쓰기 옵션등을 잊어버리기 쉽다)

# 조건식 스크립트를 직접 지정
-e '스크립트'

# 조건식 스크립트가 기재되어있는 파일을 지정
-f '스크립트 파일명'

# 표시를 억제(명시적으로 스크립트중에 P를 적으면 표시하는 것도 가능)
-n '스크립트'

# 확장 정규표현을 사용한 스크립트를 기술
-r '정규표현을 사용한 스크립트'

-i 입력 파일의 덮어쓰기

# 덮어쓰기 전의 파일을 확장자.bak를 붙여서 보관하는 것이 가능하다
sed -i.bak -e '/^#/d' config.txt

 

SED조건식

행번호     # 처리할 행 번호를 지정한다.
행번호,행번호    # 지정한 행 번호 사이의 문자열에 대한 처리를 한다.$를 지정하면 마지막 행을 표시해준다.
/문자열/    # 지정한 문자열이 발견된 행을 처리한다. 맨 앞에「^」를 붙이면 지정한 문자열로부터 시작하는 행, 행 끝에「$」를 붙이면 지정한 문자열로 끝나는 행이 대상이 된다. 행 번호의 범위를 지정해서도 사용할 수 있다.
:라벨    # b및 t커맨드용 라벨
#코멘트    # 코멘트
{..}   # 괄호 안을 블록으로써 다룬다.
=   # 현재의 행 번호를 표시한다.
a 문자열     # 문자열을 추가한다. 그러나 개행하고 싶은 경우에는 그 앞에 \를 붙인다.
i 문자열     # 문자열을 삽입한다. 그러나 개행하고 싶은 경우에는 그 앞에 \를 붙인다.
q   # 처리를 중단하고 sed를 종료한다.
r 파일명   # 지정한 파일을 읽어들여 추가한다.
b 라벨     # 지정한 라벨로 이동한다.
t 라벨     # s///가 성공하고 있다면 지정한 라벨로 이동한다.
c 문자열   # 선택된 행을 문자열로 치환한다. 그러나 개행하고 싶은 경우에는 그 앞에 \를 붙인다.
d   # 패턴・스페이스를 삭제한다.
D   # 패턴・스페이스 안의 제일 첫 개행까지 삭제한다.
h   # 홀드・스페이스를 패턴・스페이스에 복사한다.
H   # 홀드・스페이스를 패턴・스페이스에 추가한다.
g   # 홀드・스페이스를 패턴・스페이스에 복사한다.
G   # 홀드・스페이스를 패턴・스페이스에 추가한다.
x   # # 홀드・스페이스와 패턴・스페이스를 교체한다.
n   # 다음 행을 패턴・스페이스로 읽어들인다.
N   # 다음 행을 패턴・스페이스로 추가한다.
p   # 현재의 패턴・스페이스를 표시한다.
P   # 현재의 패턴・스페이스의 첫 번째 나타나는 개행까지를 표시한다.
w 파일명    # 현재의 패턴・스페이스를 지정한 파일에 쓴다.
s/치환조건/치환문자/    # 치환 조건 대상에 맞는 문자를 치환 문자로 변환한다. 마지막에 g를 붙인 경우 치환 대상이 되는 모든 문자열을 치환한다.
y/변환 대상의 문자/변환문자/   # 변환 대상의 문자를 변환 문자로 변환한다.

참고자료

https://qiita.com/hirohiro77/items/7fe2f68781c41777e507

728x90