sed란?
- streamlined editor의 약자
- sed는 vi 편집기와 같은 편집을 위한 명령어.
- vi 편집기는 편집기를 열어 화면과 상호작용하는 대화형 방식이지만 sed 편집기는 명령행에서 파일을 인자로 받아 명령어를 통해 작업한 후 결과를 화면으로 확인하는 방식
- sed 편집기는 쉘 리다이렉션을 이용해 편집 결과를 저장하기 전까지는 파일에 아무런 변경도 가하지 않음
- 명령 수행 후 출력 결과가 원본과 다르더라도 원본에 손해가 없음
sed의 워크스페이스
- sed 편집기는 동작 시 내부적으로 두 개의 워크스페이스를 사용함

패턴 스페이스 (= 패턴 버퍼)
- sed가 파일을 라인단위로 읽을 때 읽은 라인이 저장되는 임시 공간
- sed 명령어를 통해 내용 조작이나 출력을 수행하면 패턴 버퍼의 내용이 사용됨
홀드 스페이스 (= 홀드 버퍼)
- 패턴 버퍼보다 좀 더 길게 가지고 있는 저장소
- 이전에 작업하던 라인 기억 가능
- 어떤 내용을 홀드 버퍼에 저장하면, sed가 다음 행을 읽더라도 원할 때 다시 불러와 재사용 가능
sed option
sed -help 또는 man sed 를 입력하여 sed 도움말을 확인할 수 있음
| option | 설명 |
|---|
| -e | 조건식 스크립트를 직접 지정 |
| -f | 조건식 스크립트가 기재된 파일을 지정 |
| -n | 패턴이 일치하는 라인만 출력 |
| -r | 확장 정규표현을 사용한 스크립트를 사용 |
| -i | 수정한 내용으로 파일 덮어쓰기 |
sed subcommand
| subcommand | 설명 |
|---|
| a\ | 현재 행에 하나 이상의 새로운 행 추가 |
| c\ | 현재 행의 내용을 새로운 내용으로 교체 |
| d | 행 삭제 |
| i\ | 현재 행의 위에 텍스트 삽입 |
| h | 패턴 스페이스의 내용을 홀드 스페이스에 복사 |
| H | 패턴 스페이스의 내용을 홀드 스페이스에 추가 |
| g | 홀드 스페이스의 내용을 패턴 스페이스에 덮어쓰기 |
| G | 홀드 스페이스의 내용을 패턴 스페이스에 추가 |
| l | 출력되지 않는 특수문자를 명확하게 출력 |
| 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 사용 예시
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
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
참고
https://seul96.tistory.com/315
https://jhnyang.tistory.com/287
https://engineer-mole.tistory.com/235
https://marindie.github.io/linux/Sed-Append-KR/#