공부/Linux

Bash를 이용해 여러 파일의 내용을 치환하기

토고미 2022. 7. 15. 18:22

변수 명이 변경되거나 URL 주소가 바뀌는 등, 여러 파일에서 참조하는 값의 이름이 변경되는 경우가 있다.

 

보통 sed를 이용하면 바꿀 수 있지만 하위 디렉토리까지 재귀적으로는 할 수없다.

 

하지만 grep과 sed를 같이용하면 recursive하게 하위 디렉토리의 파일까지 내용을 바꿀 수 있다.

grep -rl 기존문자열 . | xargs sed -i 's/기존문자열/수정후문자열/g'

이렇게 하면 해당 디렉토리부터 하위 디렉토리까지 모든 파일을 탐색하며 {기존문자열} → {수정후문자열}로 바꾼다.

 

만약 특정 확장자인 파일의 내용만 치환하고 싶으면 아래와 같이 --include 옵션을 쓰면된다.

grep -rl 기존문자열 --include \*.go | xargs sed -i 's/기존문자열/수정후문자열/g'

위 예시는 .go 파일의 내용만 바꾸는 예시이다.

 

 

참고

- https://stackoverflow.com/questions/12516937/how-can-i-grep-recursively-but-only-in-files-with-certain-extensions

- https://stackoverflow.com/questions/1583219/how-can-i-do-a-recursive-find-replace-of-a-string-with-awk-or-sed