쿼카러버의 기술 블로그

[Linux] sed - 리눅스 명령어 sed에 대해서 본문

Linux - Ubuntu/Shell Script

[Linux] sed - 리눅스 명령어 sed에 대해서

quokkalover 2021. 8. 18. 18:31

sed 명령어는 편집에 특화된 명령어다.

sed = streamlined editor의 약자 (능률적인)

  • 수정
  • 치환
  • 삭제
  • 글 추가
    등 편집기 기능을 수행할 수 있다.

vi, vim은 편집기를 열어서 수정하는 방식이라면, sed는 명령행에서 파일을 인자로 받고, sed 명령어를 통해 작업한 후에 결과를 화면으로 확인할 수 있다.

sed 명령어를 이용해서 파일을 변경할 경우엔 원본을 손상하지 않는다.
쉘 리다이렉션을 통해서 편집 결과를 저장하지 않는 이상 파일이 변경되지 않는다.
모든 결과는 명령을 수행한 화면으로 출력이 되고, 원본에는 손해가 없다는 것이 명령어의 특징이다.

원리를 자세히 알기 위해선, pattern space, hold space에 대한 개념이해가 돼야 하지만 해당 내용은 추후에 다루고, 일단 가장 대표적으로 많이 쓰이는 명령어들을 먼저 살펴보자.

아래와 같은 텍스트 파일이 있다고 해보자.
richet.txt

richet
want
to
be
richet

1) 특정 범위 만큼 파일 내용 출력
-n = 작업한 부분만 억제해서 출력하기 위해 사용하는 옵션
p = 프린트
, = 범위를 정함 1,3 = 1부터 3까지
$ = 끝

#첫 번째 라인만 출력
sed -n '1p' richet.txt

#richet

#1~3번째 라인 출력
sed -n '1,3p' richet.txt
#richet
#want
#to

#3번째 라인 부터 끝까지
sed -n '3,$p' richet.txt
#문서 전체

2) -e 옵션을 활용해서 여러 조건 출력

sed -n -e `1p` -e `3,$p` richet.txt

#richet
#to
#be
#richet

2) 파일에서 공백으로 이루어진 줄이나 빈줄 제거
/ = /사이에 들어있는 단어
d = delete의 약자
^ = 행의 시작
$ = 행의 끝
* = 메타문자로 앞의 문자를 0개이상 찾음

#1) 빈라인 모두 삭제 한 내용 출력
sed '/^$/`d richet

#2) 빈라인 모두 삭제 한 내용 richet_new.txt로 저장
sed '/^$/`d richet > richet_new.txt

#3) 0개 이상의 공백을 가진 = 빈줄 삭제 후 richet_new.txt 저장
sed '/^ *$/`d richet > richet_new.txt

3) 치환
richet이라고 돼 있는 부분을 euntaek으로 변경해보자.
s = switch의 약자. 치환할 때 사용하는 subcommand임.
g = 치환이 행에서 전체를 대상으로 이루어지는 것을 말함. (바꿀게 여러개 있으면 다 바꾼다는 것. 원래 sed는 행별로 하는데 g플래그를 쓰면 전체에서 다 뽑힘.)
i = 변경 대상 단어를 찾을 때 대소문자를 무시

#1) 파일 전체에서 richet이라는 단어를 찾아 euntaek으로 변경
sed 's/richet/euntaek/g' richet.txt

#2) 1)에서 수행한걸 리다이렉션을 통해 richet_new.txt로 저장
sed 's/richet/euntaek/g' richet.txt > richet_new.txt

#3) 대소문자를 무시하고 삭제
sed 's/richet/euntaek/gi' richet.txt > richet_new.txt

4) 치환 with environment variable

아래와 같은 test 라는 파일이 있다고 했을 때

test

my name is $NAME
#!/bin/sh
NAME=richet
FILENAME=test
envvar=`echo $NAME | tr '[a-z]' '[A-Z]'`
sed "s/\$NAME/$envvar/g" $FILENAME > $FILENAME.new

참고자료:
https://jhnyang.tistory.com/287

Comments