미스터 역마살

[Linux] SED 본문

IT/기타

[Linux] SED

Mr. YeokMaSsal 2022. 7. 26. 20:20
728x90
반응형

SED란?

정규식과 같은 패턴 식을 적용하여 파일을 원하는대로 편집할 수 있는 프로그램 이다. vi 편집기처럼 직접 파일을 열어 고치지 않고 커맨드 창 또는 스크립트에서 동작을 하여 원하는 부분만 변경해준다는 특징이 있다.

 

SED 특징

sed는 쉘 또는 스크립트에서 파이프(|)와 같이 사용될 수 있는 명령어이다.

그리고 기본적으로 정규표현식이 사용가능하기 때문에 정규표현식을 알면 더 고급지게 sed를 이용할 수 있다.

주의할 점은 정규표현식을 사용하기 때문에 특수문자 앞에 역 슬래시(\,\)를 붙여주어야 합니다. \를 쓰면 리눅스에서는 역슬래시로 받아들인다.

예) sed 's/\$man/man/g' test.txt

 

SED 옵션

  • e  : sed를 사용하였을 때 출력되는 값을 보여준다. 이 옵션은 기본값으로 굳이 안 써도 되지만 다중 명령어를 쓸 때는 반드시 써야 한다.

  • n :  특정 값이 들어간 줄만 출력해주는 기능이다. 주로 p 명령어와 사용된다.
  • f :  스크립트를 파일로부터 읽어들이며 명령어를 지정하는 명령어라고 하는데 저는 거의 사용하지 않는다.
  • i :  변경되는 값을 실제로 파일에 저장하는 옵션이다. 출력되는 값이 없이 바로 실제 파일에 적용되는 것이 특징이다.

 

SED 자주 쓰는 명령어

특정 범위 만큼 파일 내용 출력

# employees파일에서 첫 번째 행만 출력해서 화면에 보여준다.
sed -n '1p' employees;

# employees파일에서 1~3라인 범위의 내용을 출력해서 보여준다.
sed -n '1,3p' employees;

# employees파일에서 8라인부터 파일끝까지 출력해서 보여준다. $는 '끝'을 의미합니다.
sed -n '8,$p' employees;

# employees파일의 1행 출력, 8번부터 마지막 행 까지 출력
sed -n -e '1p' -e '8,$p' employees

# file파일에서 love가 포함된 행들을 찾아 출력으로 보여줘 (-n 옵션이 있어야 love 패턴을 포함하는 줄들만 출력합니다)
sed -n '/love/p' file

# file파일에서 west가 나오는 행과 east가 나오는 행 사이의 모든 행들이 출력됩니다. west가 east 다음에 나오면 west가 나오는 행부터 파일의 마지막까지 출력됩니다.
sed -n '/west/,/east/p' file

# 3번째 행부터 employee로 시작되는 행까지 출력합니다.
sed -n '3,/^employee/p' file

 

특정 단어로 시작하는 행들만 추출

# 107로 시작하는 행 출력
sed -n '/^107/p' employees  

# 103이 포함된 행 출력
sed -n '/103/p' employees

 

공백이나 빈줄 제거

# employees파일에서 빈 라인들을 지운 후 내용을 출력해준다.
sed '/^$/d' employees

# employees파일에서 빈 라인들을 삭제한 후 결과를 new_employees라는 파일명으로 저장한다.
sed '/^$/d' employees > new_employees

# employees파일에서 빈 라인들이나 공백으로 채워진 행들을 삭제한 후 new_employees라는 파일명으로 저장한다.
sed '/^ *$/d' employees > new_employees

# file파일에서 3번째 행을 삭제합니다. 나머지 행들이 출력.
sed '3d' file

# 5번째 행부터 마지막 행까지 삭제, 그리고 나머지 행들이 출력된다.
sed '5,$d' file

# 마지막 행을 삭제. d명령어로 삭제된 행 이외의 모든 행들이 출력됨
sed '$d' file

# 파일에서 apple 포함하는 모든 행을 삭제 나머지 행을 출력합니다.
sed '/apple/d' file

 

단어 치환

# IT_PROG라는 단어를 찾아 DEVELOPER라는 단어로 변경해줘!
sed 's/IT_PROG/DEVELOPER/g' employees

# IT_PROG라는 단어를 찾아 DEVELOPER라는 단어로 변경해줘! (대소문자 무시하고)
sed 's/it_prog/DEVELOPER/gi' employees > new_employees

# [0-9][0-9]는 두 자리 숫자를 의미하죠. 근데 그 다음에 끝을 의미하는'$'가 왔어요. 
# 즉 '두 자리 숫자로 끝나는 행'이 바꿈의 대상이 됩니다. 여기서 '&'는 검색열에서 지정한 문자열을 대신합니다. 
# 그 문자열 뒤에 '.5'가 붙었네요. 즉 두자리 숫자로 끝나는 행 (ex 94) 를 찾으면 뒤에 점오를 붙인 단어로 (ex 94.5) 치환해 보여달라는 명령어입니다.
sed 's/[0-9][0-9]$/&.5/' file

 

파일 읽기 및 쓰기

# file파일로부터 ref라는 단어를 찾으면 그 패턴찾은 행 뒤에 addfile의 내용을 붙여 출력합니다.
sed '/ref/r addfile' file


# file파일로부터 north라는 패턴이 포함된 행을 찾으면 그 선택한 행들을 outputfile에다가 저장합니다.
sed -n '/north/w outputfile' file

# file파일에서 END로 끝나는 행을 찾아, 그 다음에 'THANK YOU FOR READING'을 추가합니다.
sed '/END$/a\THANK YOU FOR READING' file

 

SED Subcommand 종류

 

SED의 메타문자

  • ^ : 행의 시작 지시자
    ex) /^test/ : test로 시작하는 행

  • $ : 행의 끝 지시자
    ex) /test$/ : test로 끝나는 행

  • . : 하나의 문자
    ex) /t..t/ : t로 시작하는 문자 다음에 두 글자가 오고 t로 끝나는 문자열을 포함하는 행

  • *** : 0개 혹은 임의의 임의 갯수**
    ex) /*test/ 0개 혹은 임의 갯수의 문자 후에 test로 끝나는 행

  • [] : [] 사이의 문자 집합
    ex) /[Tt]est/ : Test, test

  • [^] : 문자 집합에 속하지 않는 한 문자와 대응
    ex) /[^A-K]est/ : A ~ K를 제외한 문자와 est가 붙어있는 문자열

  • \(..\) : 태그로 문자열을 지정하는데 사용
    ex) s/\(lov\)able/\1er/ : 지정한 lov를 tag 1로 저장한다. tag로 저장한 값은 \1을 사용한다 tag는 9개까지 가능하다.

  • & : 검색열을 저장하여 다음에 사용
    ex) s/test/&/ : test를 test로 치환

  • \< : 단어의 시작 지시자
    ex) /\<test/ : test로 시작하는 단어를 포함하는 행

  • \> : 단어의 끝 지시자
    ex) /\>test/ : test로 끝나는 단어를 포함하는 행

  • x\{m\}/ : 문자 x를 m번 반복한다.
    ex) /a\{5\} : a가 5번 반복

  • x\{m,\}/ : 문자 x를 최소 m번 반복한다.
    ex) /a\{5,\}/ : a가 적어도 5번 반복

  • x\{m,n\} : 문자 x를 m회 이상 n회 이하 반복한다.
    ex) /a\{5,10\}/ : a가 5회에서 10회 사이로 반복

 

참고자료

https://jhnyang.tistory.com/287

 

 

 

728x90
Comments