[Linux] SED 명령어 사용법

hwwwa·2023년 2월 6일
1

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 -i.bak -e '/^#/d' my.conf

sed subcommand

subcommand설명
a\ 현재 행에 하나 이상의 새로운 행 추가
c\ 현재 행의 내용을 새로운 내용으로 교체
d행 삭제
i\ 현재 행의 위에 텍스트 삽입
h패턴 스페이스의 내용을 홀드 스페이스에 복사
H패턴 스페이스의 내용을 홀드 스페이스에 추가
g홀드 스페이스의 내용을 패턴 스페이스에 덮어쓰기
G홀드 스페이스의 내용을 패턴 스페이스에 추가
l출력되지 않는 특수문자를 명확하게 출력
p행 출력
n다음 입력 행을 첫 번째 명령어가 아닌 다음 명령어에서 처리
qsed 종료
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

참고
https://seul96.tistory.com/315
https://jhnyang.tistory.com/287
https://engineer-mole.tistory.com/235
https://marindie.github.io/linux/Sed-Append-KR/#

0개의 댓글