Stream editor 인 sed 사용법(GNU sed 기준)

주요 옵션

sed 는 GNU 의 getopt 를 사용하므로 short, long option 방식 지원함(GNU getopt 참고)

옵션의미비고
-n, --quiet패턴 스페이스에 있는 내용을 자동 출력하지 않음
-e script, --expression=script실행할 스크립트 지정
-f script-file, --file=script-file실행할 스크립트 파일 지정
-i[SUFFIX], --in-place[=SUFFIX]변경된 내용을 파일에 적용SUFFIX 가 지정됐을 경우 백업 파일을 만듦
-E, -r, --regexp-extended확장 정규식 패턴 사용


아래와 같은 파일(sed-example.txt)이 있을 경우 sed 를 이용해서 다양하게 처리가 가능


내용 교체

substitution 연산자인 s 를 사용하면 sed-example.txt 에서 unix 구문이 처음 나올 경우 linux 로 내용 교체

첫 번째 내용 교체

$ sed 's/unix/linux/' sed-example.txt

linux is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
BASH


모든 내용 교체

찾은 모든 내용에 대해 적용하는 g 를 사용하면 2 번째이후에 발견한 패턴도 모두 교체

첫 번째 내용 교체

$ sed 's/unix/linux/g' sed-example.txt

linux is great os. linux is opensource. linux is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.linux is a multiuser os.Learn linux .linux is a powerful.
BASH


n 번째 라인만 교체

s 앞에 적용할 라인 번호를 지정하면 해당 라인에만 정규식을 적용함

첫 번째 내용 교체

$ sed '4 s/unix/linux/' sed-example.txt

linux is great os. linux is opensource. linux is free os.
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
BASH


4번째 라인의 모든 패턴에 적용하려면 g 추가

첫 번째 내용 교체

$ sed '4 s/unix/linux/g' sed-example.txt

linux is great os. linux is opensource. linux is free os.
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
linux is easy to learn.linux is a multiuser os.Learn linux .linux is a powerful.
BASH




실제 사용 예제

파일내 특정 패턴 치환

sonatype nexus 에 등록된 artifact 의 groupID가 example 로 시작되어 com.example 으로 일괄 변경하고 싶음


해당 정보는 maven의 pom 파일에 정의되어 있고 다음과 같은 형식을 갖음

build.pom

 <?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>example</groupId>
  <artifactId>myartifact</artifactId>
  <version>2.0</version>
  <description>POM was created by Sonatype Nexus</description>
</project>                   
CODE


위의 <groupId>example</groupId>  를  <groupId>com.example</groupId>로 치환

find . -name \*pom -exec grep "<groupId>example" /dev/null {} \;|awk -F: '{print "sed -i '\'s'/groupId>example/groupId>com.example/'\'' "$1}'|sh -x
BASH


sed 의 i 옵션은 -i[SUFFIX], --in-place[=SUFFIX] 로 stdout 에 변경된 파일을 출력하지 않고 해당 파일의 내용을 직접 변경함


또는 간단하게 xargs 로 연결하여 처리

find . -name \*pom -exec grep "<groupId>example" /dev/null {} \;|sed -i 's/groupId>example/groupId>com.example/'
CODE



nginx 의 port 변경

-e 옵션을 사용하여 여러 개의 명령어를 실행할 수 있음. nginx 의 가상 호스트 설정중 80, 443 포트를  8080, 8443 으로 변경

#!/bin/sh


for i in /etc/nginx/sites-available/*; do cp $i $i.org; sed -e 's/\<80\>/8080/g' -e 's/\<443\>/8443/g' < $i.org > $i;done
CODE


nginx 가상호스트 링크

nginx 의 가상 호스트 지정은 sites-available 폴더에 하고 활성화는 site-enabled 에 하기 위해 sites-available 에 있는 모든 파일을 symbolic link

#!/bin/sh

for s in /etc/nginx/sites-available/*;do
    t=`echo $s|sed 's/sites-available/sites-enabled/'`;
    ln -sf $s $t;
done
BASH


ubuntu 미러 변경


같이 보기

Ref