Linux 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.
모든 내용 교체
찾은 모든 내용에 대해 적용하는 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.
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.
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.
실제 사용 예제
파일내 특정 패턴 치환
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>
위의 <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
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/'
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
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
ubuntu 미러 변경
같이 보기
- 같이 사용하면 좋은 여러 조건으로 파일을 찾는 Linux find 명령어 사용법
- https://github.com/tldr-pages/tldr/blob/master/pages/common/sed.md