배우는 내용 : [ sed 삭제(d), 출력(p), 치환(s) ]

sed

vim 과 sed 비교

  vim sed
1 파일 열기 셸에서 편집내용(스크립트) 을 입력 
2 메모리상에서 편집  편집
3 저장 편집 결과를 표준 출력에 출력 (저장 x)

sed 명령어 

sed [옵션] <스크립트> <대상 파일>

 <스크립트> : 주소(정규 표현식도 가능)와 명령어를 조합한 문자열, 주소가 없으면 모든 행에대해 명령어가 실행된다.

동작방식:

한 행을 읽으면 먼저 패턴 스페이스라는 장소에 복사

편집 명령어를 실행한 뒤 패턴 스페이스의 내용을 출력

기본적으로 패턴 스페이스에 있는 내용을 자동으로 출력

* 패턴 스페이스 (패턴 버퍼) : 현재 작업중인 텍스트의 임시 저장 공간

<실습파일 내용>

Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine

 

삭제  ( d )

$ sed 1d drink2.txt   # 첫 번째 행을 삭제
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine

$ sed 2,5d drink2.txt  # 2 행부터 5행까지 삭제
Ber
My Vodka
My Wine

$ sed '3,$d' drink2.txt # 3행 부터 마지막 행까지 삭제
Ber
Beer

$ sed /^B/d drink2.txt # B로 시작하는 행 삭제
My Vodka
My Wine

 - $ 는 마지막 행을 의미

 

출력 ( p )

$ sed 1p drink2.txt # 1행을 출력
Ber
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine

 sed는 기본적으로 패턴 스페이스의 내용을 출력

    1. sed 는 해당 파일의 각 줄(행)을 순차적으로 읽어 패턴 스페이스에 로드

    2. 1p 명령에 따라  1행이 추가로 출력 

    3. -n 옵션의 부재로 모든 행을 출력

 

$ sed -n 1p drink2.txt 
Ber

치환 ( s )

's/(치환 전 문자열)/(치환 후 문자열)/옵션'
$ sed 's/Beer/Whisky/' drink2.txt
Ber
Whisky
WhiskyBeer
WhiskyBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine

$ sed 's/Beer/Whisky/g' drink2.txt # g 옵션 포함
Ber
Whisky
WhiskyWhisky
WhiskyWhiskyWhisky
Beeeeeeeeer!!!
My Vodka
My Wine

$ sed 's/^B.*r/Whisky/g' drink2.txt  # B로 시작하고 r로 끝나는 문자열 치환
Whisky
Whisky
Whisky
Whisky
Whisky!!!
My Vodka
My Wine

 'g' : 발견한 모든 문자 치환

 

명령어 조합

$ sed 's/!//g' drink2.txt      # !를 전부 삭제
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer
My Vodka
My Wine

$ sed -n 's/!//gp' drink2.txt  # -n : 치환된 행만 출력 
Beeeeeeeeer

# 1행과 3행 사이의 문자열 중에서 Beer 를 Whisky로 치환
$ sed '1,3s/Beer/Whisky/g' drink2.txt 
Ber
Whisky
WhiskyWhisky
BeerBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine

 'g' : 발견한 모든 문자 치환

 

확장 정규 표현식 사용 -r

- 기본 정규 표현식과 확장 정규 표현식

$ sed -r 's/Be+r/Whisky/' drink2.txt
Whisky
Whisky
WhiskyBeer
WhiskyBeerBeer
Whisky!!!
My Vodka
My Wine

$ sed 's!Be\+r!Whisky!' drink2.txt
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine

 # s 뒤에 ! 혹은 %를 이용하여 구분자(/)를 바꿀 수 있다.

 

치환 전 정규 표현식을 통해 치환 후 문자열을 \1 로 참조하는 방법

기본 정규 표현식 확장 정규 표현식
\(\) 로 그룹화 하여 \1 로 참조 ()로 그룹화 하여 \1 로 참조

 

$ sed -r 's!My (.*)!--\1--!'
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
--Vodka--
--Wine--

sed 's/My \(.*\)/--\1--/' drink2.txt
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
--Vodka--
--Wine--

+ Recent posts