본문 바로가기
  • 오늘처럼
소프트웨어 아키텍처/Linux

Linux 활용 : sed 명령어를 이용하여 텍스트 파일 치환

by bluefriday 2021. 9. 5.
반응형

SED (Stream EDitor for filtering and transforming text)

Usage :

sed [OPTION]… {script-only-if-no-other-script} [input-file]…

Option:
-i in place. 현재 파일을 그대로 수정

 

텍스트 파일의 값을 치환

#set -i "s/대상텍스트/변경텍스트/g" 대상파일
sed -i "s/public/private/g" test.sql

 

텍스트 파일의 각 라인 끝 문자열을 제거 (혹은 수정)

#sed -i "s/.\{제거할문자수\}$//g" 대상파일
sed -i "s/.\{6\}$//g" test.sql

#만약 제거하고 다른 텍스트를 추가할 경우 하단과 같이 처리
sed -i "s/.\{6\}$/test/g" test.sql

 

템플릿 파일을 생성후 값을 추가하여 구성 파일 생성

아래와 같이 application의 템플릿 파일을 생성하고, 변경되는 변수를 [[VAR]], [[VAR2]], .. 등으로 템플릿 파일안에 기록한다. 그 후에 sed 명령어와 pipeline 을 통하여 config 파일을 작성한다. sed 의 '-i' 옵션을 줘서 파일 자체를 변경할 수도 있으나, 템플릿 파일의 특성상 변경되는 값들로 새로운 파일을 계속 생성하기 위하여 옵션을 주지 않고 하단과 같이 명령을 수행하여 application.conf 파일을 생성한다. 

sed "s/[[VAR1]]/$VAR1/g" /conf/application.conf.template | \
sed "s/[[VAR2]]/$VAR2/g" | \
sed "s/[[VAR3]]/$VAR3/g" | \
sed "s/[[VAR4]]/$VAR4/g" \ > /conf/application.conf



특정 위치를 기점으로 하위 폴더 내의 파일내용을 일괄 변경

특정위치에서 조건에 만족하는 파일의 특정 문구를 일괄 수정하고 싶을 경우에는 sed 명령어와 find 명령어를 결합하여 아래와 같이 사용할 수 있다. 

find ./ -name "찾을 파일" -exec sed -i "s/찾을 내용/바꿀 내용/g" {} \;
  • 찾을파일 : 와일드카드를 포함하여 주면 특정 확장자의 모든 파일을 대상으로 명령을 수행할 수 있다.
  • 찾을내용 : 찾을내용에 (/) 가 포함되는 경우 앞에 역슬래쉬를 추가하여 준다. (ex: / -> \/)
  • 바꿀내용 : 위와 동일

 

활용 예는 아래와 같다.

#현재 경로 하위의 모든 conf 확장자 파일들의 내용 중 "hello" 단어를 "world" 로 변경
find ./ -name "*.conf" -exec sed -i "s/hello/world/g" {} \;


#현재 경로 하위의 모든 yaml 확장자 파일들의 내용 중 "helloworld.com" 을 "helloworld.net" 으로 변경
find ./ -name "*.yaml" -exec sed -i "s/helloworld\/com/helloworld\/net/g" {} \;

 

 

댓글