본문 바로가기
OS 운영체제/LINUX

sed (텍스트 편집 명령어)

by yororing 2024. 6. 12.

00 개요

  • shell script에 겁나 많이 나옴

01 sed 명령어란

1. sed 명령어 정의

  • 'stream editor'의 약자
  • vi 편집기와 비슷하지만 다름
    • vi는 편집기를 열어 화면과 상호작용하는 대화형 방식, sed는 명령행에서 파일을 인자로 받아 명령어를 통해 작업한 후 결과를 화면으로 확인하는 방식
  • shell redirection을 이용해 편집 결과를 저장하기 전까지는 파일에 아무런 변경 가하지 않음
    • 즉, 명령 수행 후 출력 결과가 원본과 다르더라도 원본에 손해가 없음 

2. sed 명령어의 기능

  • text를 filter하고 변환
  • 입력받은 stream (파일이나 파이프라인으로부터의 입력)에 대해 기본적은 텍스트 변환을 수행함
  • ed 명령어와 같이 scripted edits를 permit하는 editor와 비슷하나 sed는 works by making only one pass over the input(s)하므로 더 성능이 좋음
  • 그러나 it's sed's ability to filer text in a pipeline which particularly distinguished it from other types of editors

3. sed 명령어 문법

sed [OPTION] ... {script-only-if-no-other-script} [input-file]...

02 sed 옵션

옵션 설명
-n, --quiet, --silent suppress automatic printing of pattern space - 패턴이 일치하는 라인만 출력
-e script, --expression=script add the script to the commands to be executed - 조건식 스크립트를 직접 지정
-f script-file, --file=script-file add the contents of script-file to the commands to be executed - 조건식 스크립트가 기재된 파일을 지정
--follow-symlinks follow symlinks when processing in place
-i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied) - 수정한 내용으로 파일 덮어쓰기
→ 덮어쓰기 전의 파일을 따로 저장 가능:
sed -i.bak -e '/^#/d' my.conf
-c, --copy use copy instead of rename when shuffling files in -i mode
-b, --binary does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX ( open files in binary mode (CR+LFs are not treated specially))
-l N, --line-length=N specify the desired line-wrap length for the 'l' command
--posix disable all GNU extensions
-r, --regexp-extended use extended regular expressions in the script - 확장 정규표현을 사용한 스크립트 사용
-s, --separate consider files as separate rather than as a single continuous long stream
-u, --unduffered load minimal amounts of data from the input files and flush the output buffers more often
-z, --null-data separate lines by NUL characters
--help display help manual and exit
--version output version info and exit

03 sed 서브 명령어 (subcommand)

서브명령어 설명
a\ 현재 행에 하나 이상의 새로운 행 추가
c\ 현재 행의 내용을 새로운 내용으로 교체
d 행 삭제 delete
i\ 현재 행의 위에 텍스트 삽입
h 패턴 스페이스의 내용을 홀드 스페이스에 복사
H 패턴 그페이스의 내용을 홀드 스페이스에 추가
g 홀드 스페이스의 내용을 패턴 스페이스에 덮어쓰기
G 홀드 스페이스의 내용을 패턴 스페이스에 추가
l 출력되지 않는 특수문자를 명확하게 출력
p 행 출력 print
n 다음 입력 행을 첫 번째 명령어가 아닌 다음 명령어에서 처리
q sed 종료 quit
r 파일로부터 행 읽어오기 read
! 선택된 행을 제외한 나머지 전체 행에 명령어 적용
s 문자열 치환 substitute

1. s와 함께 사용하는 치환 플래그

flag 설명
g 치환이 행 전체에 대해 이뤄짐 globally
p 행 출력
w 파일에 쓰기
x 홀드 스페이스와 패턴 스페이스의 내용을 서로 맞바꾸기
y 한 문자를 다른 문자로 변환 (정규표현식 메타문자 사용 불가능)

04 메타 문자

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

05 sed 사용 예시

# 8행부터 끝까지 출력
sed -n '8,$p' test.txt

# #로 시작하는 코멘트행 삭제
sed '/^#/d' test.txt

# 빈 행 삭제
sed '/^$/d' test.txt

# 첫 번째로 나타난 'redis' 문자를 '레디스'로 치환
sed -e 's/redis/레디스/3' test.txt

# 모든 'redis' 문자를 '레디스'로 치환
sed -e 's/redis/레디스/g' test.txt

# 대소문자 구분하지 않고 모든 'redis' 문자를 '레디스'로 치환
sed -e 's/redis/레디스/gi' test.txt

# 파일의 마지막에 내용 추가 후 기존 내용(원본) 덮어쓰기
sed -i '$a추가할내용' test.txt

# 탭을 스페이스로 변환
sed -e 's/<tab>/<space>/g' test.txt

참조 

  1. man sed
  2. https://velog.io/@inhwa1025/Linux-SED-명령어-사용법 
  3.