sed 란?
- streamlined editor 의 약자
- sed 는 vi 편집기와 같은 편집을 위한 명령어
- vi 편집기는 편집기를 열어 화면과 상호작용하는 대화형 방식이지만
sed 편집기는 명령행에서 파일을 인자로 받아 명령어를 통해 작업한 후 결과를 화면으로 확인하는 방식 - sed 편집기는 쉘 리다이렉션을 이용해 편집 결과를 저장하기 전까지는 파일에 아무런 변경도 가하지 않음
- 명령 수행 후 출력 결과가 원본과 다르더라도 원본에 손해가 없음
sed 의 워크스페이스
- sed 편집기는 동작 시 내부적으로 두 개의 워크스페이스를 사용함
패턴 스페이스 (= 패턴 버퍼)
- sed 가 파일을 라인단위로 읽을 때 읽은 라인이 저장되는 임시 공간
- sed 명령어를 통해 내용 조작이나 출력을 수행하면 패턴 버퍼의 내용이 사용됨
홀드 스페이스 (= 홀드 버퍼)
- 패턴 버퍼보다 좀 더 길게 가지고 있는 저장소
- 이전에 작업하던 라인 기억 가능
- 어떤 내용을 홀드 버퍼에 저장하면, sed 가 다음 해을 읽더라도 원할 때 다시 불러와 재사용 가능
sed option
option | 설명 |
-e | 조건식 스크립트를 직접 지정 |
-f | 조건식 스크립트가 기재된 파일을 지정 |
-n | 패턴이 일치하는 라인만 출력 |
-r | 확장 정규표현을 사용한 스크립트를 사용 |
-i | 수정한 내용으로 파일 덮어쓰기 |
- 덮어쓰기 전의 파일을 따로 저장 가능
sed -i.bak -e '/^#d' my.conf
sed subcommand
subcommand | 설명 |
a\ | 현재 행에 하나 이상의 새로운 행 추가 |
c\ | 현재 행의 내용을 새로운 내용으로 교체 |
d | 행 삭제 |
i\ | 현재 행의 위에 텍스트 삽입 |
h | 패턴 스페이스의 내용을 홀드 스페이스에 복사 |
H | 패턴 스페이스의 내용을 홀드 스페이스에 추가 |
g | 홀드 스페이스의 내용을 패턴 스페이스에 덮어쓰기 |
G | 홀드 스페이스의 내용을 패턴 스페이스에 추가 |
I | 출력되지 않는 특수문자를 명확하게 출력 |
p | 행 출력 |
n | 다음 입력 행을 첫 번째 명령어가 아닌 다음 명령어에서 처리 |
q | sed 종료 |
r | 파일로부터 행 읽어오기 |
! | 선택된 행을 제외한 나머지 전체 행에 명령어 적용 |
s | 문자열 치환 |
s와 함께 사용하는 치환 플래그
flag | 설명 |
g | 치환이 행 전체에 대해 이뤄짐 |
p | 행 출력 |
w | 파일에 쓰기 |
x | 홀드 스페이스와 패턴 스페이스의 내용을 서로 맞바꾸기 |
y | 한 문자를 다른 문자로 변환 (정규표현식 메타문자 사용 불가능) |
메타 문자
문자 | 설명 |
^ | 맨 앞 |
$ | 맨 뒤 |
. | 임의의 한 문자 |
* | 직전의 문자를 0회 이상 반복 |
+ | 직전의 문자를 1회 이상 반복 |
\? | 직전의 문자가 0회 혹은 1회만 출현 |
[ ] | 문자 클래스 [abc0-9]이면 숫자와 a, b, c 중 어떠한 한 문자 |
| | OR [ab | ap] 이면 ab 혹은 ap |
{3} | 직전의 문자가 3번만 출현 |
{3, 5} | 직전의 문자가 3~5번 출현 |
\b | 단어 구분 |
sed 사용 예시
- 8행부터 끝까지 출력
sed -n '8,$p' test.txt
- #로 시작하는 코멘트행 삭제
sed '/^#/d' test.txt
- 빈 행 삭제
sed '/^$/d' test.txt
- 6행부터 28행까지 삭제한 후 새로운 파일로 저장
sed '15,26d' test.txt > test2.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